LeetCode-兩數相加

YuanbaoQiang發表於2020-11-29

題目要求

原題連結2. 兩數相加

給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

解題過程

將兩個連結串列當作相同長度的連結串列處理,遇到null值,補0

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyNode = new ListNode(0);
        ListNode cur = dummyNode;
        ListNode cur1 = l1;
        ListNode cur2 = l2;
        int carry = 0;
        // while迴圈條件:兩個連結串列不同時為null
        while(!(cur1 == null && cur2 == null)){
            // 如果有節點為null,則補0
            int x = cur1 == null ? 0 : cur1.val;
            int y = cur2 == null ? 0 : cur2.val;
            int sum = x + y + carry;

            // 注意 此時進位數的計算要在下面那個賦值操作的前面
            carry = sum / 10;
            sum = sum % 10;
            
            cur.next = new ListNode(sum);
            cur = cur.next;

            if(cur1 != null) cur1 = cur1.next;
            if(cur2 != null) cur2 = cur2.next;
        }
        // 如果運算到最後發現還有進位數,說明上一次的操作和是大於10的,存在一個進位1
        // 此時無法進入到迴圈進行操作,需要特殊形況處理
        if(carry == 1){
            cur.next = new ListNode(carry);
        }
        return dummyNode.next;
    }
}

相關文章