1. 程式人生 > 實用技巧 >2. 兩數相加(連結串列)

2. 兩數相加(連結串列)

1、題目描述:

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

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

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

示例:

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

連結:https://leetcode-cn.com/problems/add-two-numbers

2、思路:

正常相加,記錄進位。

當兩個連結串列長度不相同的時候,會有一個連結串列先遍歷完,這時要繼續遍歷另一個連結串列。

當最後一個元素加完之後,也要檢查是否還有進位。

3、程式碼:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode newHead = new ListNode(-1);
        ListNode newTail = newHead;
        int flag = 0;
        while (l1 != null && l2 != null) {
            int sum = l1.val + l2.val + flag;
            flag 
= sum / 10; newTail.next = new ListNode(sum % 10); l1 = l1.next; l2 = l2.next; newTail = newTail.next; } while (l1 != null) { int sum=l1.val + flag; flag=sum/10; newTail.next = new ListNode(sum % 10); newTail
= newTail.next; l1 = l1.next; } while (l2 != null) { int sum=l2.val + flag; flag=sum/10; newTail.next = new ListNode(sum % 10); newTail = newTail.next; l2 = l2.next; } if (flag > 0) { newTail.next = new ListNode(flag); newTail = newTail.next; } newTail.next = null; return newHead.next; }

精簡答案:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if (l1 == null) return l2;
        if (l2 == null) return l1;
        
        ListNode dummyHead = new ListNode(0);
        ListNode last = dummyHead;
        // 進位值
        int carry = 0;
        while (l1 != null || l2 != null) {
            int v1 = 0;
            if (l1 != null) {
                v1 = l1.val;
                l1 = l1.next;
            }
            int v2 = 0;
            if (l2 != null) {
                v2 = l2.val;
                l2 = l2.next;
            }
            int sum = v1 + v2 + carry;
            // 設定進位值
            carry = sum / 10;
            // sum的個位數作為新節點的值
            last.next = new ListNode(sum % 10);
            last = last.next;
        }
        
        // 檢查最後的進位
        if (carry > 0) {
            // carry == 1
            last.next = new ListNode(carry);
        }
        
        return dummyHead.next;
    }

。。。