leetcode 2
思路
- 鏈表特性利用:由于數字按逆序存儲,個位在鏈表頭部,因此可以直接從前往后遍歷鏈表進行逐位相加
比如題目中的 2->4->3 和 5->6->4 其實可以直接按位從第一位開始往后相加,就得到啦708
這樣比把數字轉換為342+465 得到結果以后再把結果倒敘設置鏈表更簡單
- 進位處理:每一位相加可能產生進位(如 9+9=18,進位為 1),需要用變量 count 記錄進位值
如果有進位,那么下一次相加的時候就要把進位的數也加上,加上以后注意需要清空count,然后再判斷如果當前兩個數相加以后的值也有進位,那就繼續更新count
-
虛擬頭節點:使用虛擬節點 dummy 簡化頭節點處理,避免單獨判斷空鏈表情況
-
邊界處理:當加到l1 l2最后的時候,最后兩位相加如果大于10那么還會有進位,此時需要單獨再判斷如果count還有值需要設置最后一位鏈表為count
實現
class ListNode {constructor(val, next = null) {this.val = val;this.next = next;}
}function addTwoNumbers(l1, l2) {let count = 0; // 記錄是否有進位// 創建虛擬節點let dummy = new ListNode();let cur = dummy;while (l1 || l2) {let val = 0;if (l1) {val += l1.vall1 = l1.next;}if (l2) {val += l2.val;l2 = l2.next;}if (count) {val += count;count = 0;}if (val > 9) {count++;val = val % 10;}cur.next = new ListNode(val);cur = cur.next;}if(count){cur.next = new ListNode(count)}return dummy.next;
}