1. 程式人生 > >兩數相加

兩數相加

{} 兩個 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(){}

兩數相加