2. 兩數相加(連結串列)
阿新 • • 發佈:2020-08-16
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; }
。。。