給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:逆序存儲,相加的時候也是逆序相加。這樣加出來的新鏈表每次相加新增一個結點並且讓當前結點的next指向新增的結點
1)引入頭結點,並讓變量指針也指向頭結點。
2)用變量記錄每次相加的進位
3)新增結點的值是兩個結點的加上上一個的進位的相加值求出來的餘數
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//爲新生成的鏈表設置頭結點,這樣就不需要考慮第一個結點是否爲空
ListNode pre = new ListNode(0);
//cur指針是在整個過程指向不斷變動,先讓它指向頭結點。
ListNode cur = pre;
//記錄進位的變量,值爲1或者0
int carry = 0;
//只要兩個鏈表裏有一個還沒有空,就接着往下相加
while(null != l1 || null!= l2){
//取兩個鏈表當前結點的值進行相加,如果鏈表已經走完了,那麼賦值爲0
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
//每次相加都是當前兩個結點的值加上進位的值
int sum = x + y + carry;
carry = sum/10;
//新增結點的值爲相加之和的餘數
cur.next = new ListNode(sum%10);
//移動鏈表往前走
cur = cur.next;
if(null != l1){
l1 = l1.next;
}
if(null != l2){
l2 = l2.next;
}
}
//如果兩個鏈表都遍歷完了,還有進位值,需要再新增一個結點
if(carry != 0){
cur.next = new ListNode(carry);
}
/*最後返回頭結點的下一個,就是鏈表的第一個結點 這裏可能會有疑問 整個過程都沒有給pre賦值,那麼爲什麼會返回它,因爲在最
開始的時候,將cur也指向了pre指向的那個結點,在相加的過程中。隨着cur的變動,會給cur最開始指向的節點的next進行賦值的
cur移動,cur = cur.next,而pre一直都沒動
*/
return pre.next;
}