兩數相加
阿新 • • 發佈:2018-04-09
{} 兩個 val sta 可能 div 開始 list mce
給定兩個非空鏈表來代表兩個非負整數,位數按照逆序方式存儲,它們的每個節點只存儲單個數字。將這兩數相加會返回一個新的鏈表。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807
定義進位變量carry,記錄每次相加的進位情況。
兩個鏈表的長度可能不同,可以使用null代替沒有的節點,使用0值代替該節點的val,
如l1=null,則sum = 0+l2.val+carry,實現為
l1 = l1!=null?l1.next:l1;
sum = (l1!=null?l1.val:0) + (l2!=null?l2.val:0) + carry;
代碼如下:
public static ListNode addTwo(ListNode l1, ListNode l2) { // h指向鏈表的頭節點,頭節點不存儲數據 ListNode h = new ListNode(0); ListNode x = h; int sum = 0; int carry = 0; while (l1!=null || l2!=null || carry!=0) { sum= (l1!=null?l1.val:0) + (l2!=null?l2.val:0) + carry; carry = sum/10; x.next = new ListNode(sum%10); x = x.next; l1 = l1!=null?l1.next:l1; l2 = l2!=null?l2.next:l2; } return h.next; }
第二行中,h指向一個空的頭節點,該節點不存儲數據,數據從第二個節點h.next開始存儲,故返回的是h.next。
這一步可以省去不少麻煩,若從h開始存儲數據,就需要在while循環前計算一次
int sum = (l1!=null?l1.val:0) + (l2!=null?l2.val:0);
int carry = sum/10;
ListNode h = new ListNode(sum%10);
x = h;
l1 = l1!=null?l1.next:l1;
l2 = l2!=null?l2.next:l2;
while(){}
兩數相加