1. 程式人生 > 實用技巧 >[LeetCode] 2. 兩數相加

[LeetCode] 2. 兩數相加

目錄




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

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

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

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

分析

  1. 逐位相加, 記錄進位, 注意最後一次是否進位

  2. 遞迴

解法

解法一

時間複雜度O(max(m,n))

空間複雜度O(max(m,n)), m和n分別為兩連結串列長度

//class ListNode {
//    int val;
//    ListNode next;
//    ListNode(int x) { val = x; }
//}
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode root = new ListNode(0);
        ListNode cursor = root;
        int carry = 0;
        // 最後一次相加進位為1也繼續執行
        while(l1 != null || l2 != null || carry != 0) {
            int l1Val = l1 != null ? l1.val : 0;
            int l2Val = l2 != null ? l2.val : 0;
            int sumVal = l1Val + l2Val + carry;
            carry = sumVal / 10;
            
            cursor.next = new ListNode(sumVal % 10);
            cursor = sumNode;
            
            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }
        
        return root.next;
    }
}

解法二

  • 遞迴
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        return addTwoNumbers(l1, l2, 0);
    }
    public ListNode addTwoNumbers(ListNode l1, ListNode l2, int carry){
        if(l1 == null && l2 == null && carry != 1) return null;
        int p = l1 == null ? 0 : l1.val;
        int q = l2 == null ? 0 : l2.val;
        int sum = p + q + carry;
        ListNode result = new ListNode(sum % 10);
        if(l1 != null) l1 = l1.next;
        if(l2 != null) l2 = l2.next;
        carry = sum / 10;
        result.next =  addTwoNumbers(l1, l2, carry);
        return result;
    }    
}