1. 程式人生 > >LeetCode 2. Add Two Numbers(C++)

LeetCode 2. Add Two Numbers(C++)

使用了O(1)的額外空間,思路是將兩個連結串列遍歷併合並,合併過程中不斷計算進位,如果計算到最後一次加法仍有進位(可能是兩個連結串列對應位置值相加產生進位或者上一次的進位加本次值又產生進位),那麼需要加一個值為1的新結點。

這種思路的優點是空間複雜度小,缺點是實現比較複雜(跟藉助一個額外的陣列和連結串列相比)。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* p1=l1,* p2=l2,*preP1 = new ListNode(0);//preP1指向P1的前一個元素
        int addF = 0;
        while(p1!=NULL&&p2!=NULL)
        {
            int addVal = p1->val + p2->val + addF;
            
            if(addVal >= 10)
            {
                addVal = addVal - 10;
                addF = 1;
            }else
                addF = 0;
            
            p1->val = addVal;
            preP1 = p1;
            p1=p1->next;
            p2=p2->next;
        }
        if(p1 != NULL || p2!=NULL)//不一樣長
        {
            if(p2!=NULL)//l2長
            {
                p2->val = p2->val + addF;
                preP1->next = p2;
                
                if(p2->val >= 10)
                {
                    p2->val -= 10;
                    addF = 1;
                }
                else
                    addF = 0;
                preP1 = p2;
                p2 = p2->next;
                while(addF&&p2!=NULL)
                {
                    p2->val = p2->val + addF;
                    if(p2->val >= 10)
                        p2->val -= 10;
                    else
                        addF = 0;
                    preP1 = p2;
                    p2 = p2->next;
                }
            }else//l1長
            {
                while(addF&&p1!=NULL)
                {
                    p1->val = p1->val + addF;
                    if(p1->val >= 10)
                        p1->val -= 10;
                    else
                        addF = 0;
                    preP1 = p1;
                    p1 = p1->next;
                }
            }
        }
        if(addF == 1)
        {
            ListNode* addNode = new ListNode(1);
            preP1->next = addNode;
        }
    return l1;
    }
};