給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:因爲存的時候是倒序存的,所以頭部依次是個位數、十位數、百位等等。
輸出是個鏈表,則新建一個鏈表去存儲,新鏈表的頭部用pre,頭部不存數據所以最後返回的是pre.next,當前位置用cur來表示。
循環條件應該是最長的那個鏈表的長度,比如l1最長,爲4,l2長度爲3,那麼第四次的時候l2的值應爲0.
每次把l1和l2當前節點的值賦給x,y,要麼是空值,要麼是有值。
用一個carry標誌位當成進位標誌,sum = x+y+carry; 算當前值,賦給cur,然後算carry,更新carry。
需要移動l1、l2,cur指針,向後移。
至此本輪計算結束。
最後返回pre.next即可。
忽略了一點的就是,兩個鏈表長度相等,且最高位有進位的時候,此時while循環爲Flase,,carry爲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) {
int carry = 0;
ListNode pre = new ListNode(0);
ListNode cur = pre;
int sum;
while(l1 != null || l2 != null){
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
sum = x + y + carry;
carry = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;
if(l1 != null) {
l1 = l1.next;
}
if(l2 != null){
l2 = l2.next;
}
}
if(carry == 1){
cur.next = new ListNode(carry);
}
return pre.next;
}
}