1. 程式人生 > >Leetcode2.兩數相加、Leetcode445.兩數相加||

Leetcode2.兩數相加、Leetcode445.兩數相加||

給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

模擬全加過程,唯一要注意的是不要忽略最後有進位的情況。

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode dummyHead = new ListNode(0);
    ListNode p = l1, q = l2, curr = dummyHead;
    int carry = 0;
    while (p != null || q != null) {
        int x = (p != null) ? p.val : 0;
        int y = (q != null) ? q.val : 0;
        int sum = carry + x + y;
        carry = sum / 10;
        curr.next = new ListNode(sum % 10);
        curr = curr.next;
        if (p != null) p = p.next;
        if (q != null) q = q.next;
    }
    if (carry > 0) {
        curr.next = new ListNode(carry);
    }
    return dummyHead.next;
}

給定兩個非空連結串列來代表兩個非負整數。數字最高位位於連結串列開始位置。它們的每個節點只儲存單個數字。將這兩數相加會返回一個新的連結串列。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

進階:

如果輸入連結串列不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。

示例:

輸入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出: 7 -> 8 -> 0 -> 7

考慮到進階要求,不能反轉連結串列,那麼只能藉助棧(或陣列)。由於返回的連結串列是從高位起的,那麼在形成連結串列的時候適合用頭插法,而不必最後再反轉連結串列。

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
    {
        stack<int> s1, s2;
        while(l1)
        {
            s1.push(l1->val);
            l1 = l1->next;
        }
        while(l2)
        {
            s2.push(l2->val);
            l2 = l2->next;
        }
        ListNode* dummy = new ListNode(INT_MAX);
        ListNode* p = dummy;
        int carry = 0, curSum = 0;
        while(s1.size() || s2.size())
        {
            curSum = carry;
            if(s1.size())
            {
                curSum += s1.top();
                s1.pop();
            }    
            if(s2.size())
            {
                curSum += s2.top();
                s2.pop();
            }
            carry = curSum > 9? 1: 0;
            curSum %= 10;
            ListNode* temp = new ListNode(curSum);
            temp->next = dummy->next;
            dummy->next = temp;
        }
        if(carry)
        {
            ListNode* temp = new ListNode(1);
            temp->next = dummy->next;
            dummy->next = temp;
        }
        return dummy->next;
    }