1、将两个链表翻转,方便相加;

2、需要考虑相加时的进位问题,以及链表移动到尾部时的情况;

3、两个链表都移动到尾部后,还需要考虑最后是否有进位的问题,如果有进位则需要多增加一个结点,若无则不需要增加。

时间复杂度:o(n)

空间复杂度:o(n)

class Solution {
 public:
    ListNode* reverse(ListNode* head) {
        ListNode* ptemp = nullptr;
        ListNode* pnode = head;

        while (pnode != nullptr) {
            ListNode* pnext = pnode->next;
            pnode->next = ptemp;
            ptemp = pnode;
            pnode = pnext;
        }
        return ptemp;
    }

    ListNode* addInList(ListNode* head1, ListNode* head2) {
        //特殊情况处理
        if (head1 == nullptr)
            return head2;
        if (head2 == nullptr)
            return head1;
		//先将两个链表翻转,方便相加
        ListNode* phead1 = reverse(head1);
        ListNode* phead2 = reverse(head2);
	  	//设置表头
        ListNode* res = new ListNode(-1);
        ListNode* ptemp = res;

        int add = 0;
        while (phead1 != nullptr || phead2 != nullptr) {
            int num1 = 0;
            int num2 = 0;
            if (phead1 != nullptr) {
                num1 = phead1->val;
            } 
            if (phead2 != nullptr) {
                num2 = phead2->val;
            } 
            
            int sum = num1 + num2;

            ptemp->next = new ListNode((sum + add) % 10 );
            add = (sum + add) / 10;

            ptemp = ptemp->next;
		  	//如果有链表已经到了尾部,则不再移动
            if(phead1 != nullptr)
                phead1 = phead1->next;
            if(phead2 != nullptr)
                phead2 = phead2->next;
        }
	  	//如果到相加到了链表的最后一位了,还需判断是否有进位
        if(add == 0) {
            ptemp->next = nullptr;
        } else {
            ptemp->next = new ListNode(add);
            ptemp->next->next = nullptr;
        }

        return reverse(res->next);
    }
};