給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,并且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
偽代碼如下:
將當前結點初始化為返回列表的啞結點。
將進位 carrycarry 初始化為 00。
將 pp 和 qq 分別初始化為列表 l1l1 和 l2l2 的頭部。
遍歷列表 l1l1 和 l2l2 直至到達它們的尾端。
將 xx 設為結點 pp 的值。如果 pp 已經到達 l1l1 的末尾,則將其值設置為 00。
將 yy 設為結點 qq 的值。如果 qq 已經到達 l2l2 的末尾,則將其值設置為 00。
設定 sum = x + y + carrysum=x+y+carry。
更新進位的值,carry = sum / 10carry=sum/10。
創建一個數值為 (sum \bmod 10)(summod10) 的新結點,并將其設置為當前結點的下一個結點,然后將當前結點前進到下一個結點。
同時,將 pp 和 qq 前進到下一個結點。
檢查 carry = 1carry=1 是否成立,如果成立,則向返回列表追加一個含有數字 11 的新結點。
返回啞結點的下一個結點。
請注意,我們使用啞結點來簡化代碼。如果沒有啞結點,則必須編寫額外的條件語句來初始化表頭的值。
請特別注意以下情況:
測試用例 說明
l1=[0,1]l1=[0,1],l2=[0,1,2]l2=[0,1,2] 當一個列表比另一個列表長時
l1=[]l1=[],l2=[0,1]l2=[0,1] 當一個列表為空時,即出現空列表
l1=[9,9]l1=[9,9],l2=[1]l2=[1] 求和運算最后可能出現額外的進位,這一點很容易被遺忘
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode curr=dummyHead;
int carry = 0;
while (l1 != null || l2 != null) {
int a = 0;
int b = 0;
if (l1 != null) {
a = l1.val;
l1 = l1.next;
}
if (l2 != null) {
b = l2.val;
l2 = l2.next;
}
int sum = carry + a + b;
int value = sum % 10;
carry = sum / 10;
curr.next = new ListNode(value);
curr = curr.next;
}
if (carry>0) {
curr.next = new ListNode(carry);
}//需要進位
return dummyHead.next;
}
}