題目
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 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;
}
};