&LeetCode0002& 兩數相加

題目

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

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

來源:力扣(LeetCode

思路

在遍歷鏈表的同時按從低到高的順序直接相加;
首先,while 循環的條件是兩個鏈表中只要有一個不爲空,因爲鏈表可能爲空,所以在取當前結點值的時候,先判斷,若爲空則取0,否則取結點值;
然後,把兩個結點值相加,同時還要加上進位 carry;
其次,更新 carry,直接 sum/10 即可,以 sum%10 爲值建立一個新結點,連到 cur 後面, cur 移動到下一個結點;
最後,再更新兩個結點,若存在,則指向下一個位置;
while 循環退出之後,最高位的進位問題要最後特殊處理一下,若 carry 爲1,則再建一個值爲1的結點

C++代碼

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
    {
        ListNode *dummy = new ListNode(-1), *cur = dummy;
        int carry = 0;
        while (l1 || l2)
        {
            int val1 = l1 ? l1 -> val : 0;
            int val2 = l2 ? l2 -> val : 0;
            int sum = val1 + val2 + carry;

            carry = sum / 10;
            cur -> next = new ListNode(sum % 10);
            cur = cur -> next;

            if (l1 != NULL)
                l1 = l1 -> next;
            if (l2 != NULL)
                l2 = l2 -> next;
        }
        if (carry == 1)
            cur -> next = new ListNode(1);
        return dummy -> next;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章