不用截圖的示例,比較容易混淆。採用下面代碼的例子便可。 leetcode-cn.com/problems/ad… ![]()
由於有說明位數是按照逆序的方式來存儲,因此直接遍歷,而後再相加,獲得的新鏈表,就是最終的結果。node
// 輸入:(1 -> 4 -> 2) + (7 -> 6 -> 4) -- 從左到右:個位/十位/百位
// 輸出:8 -> 0 -> 7
// 緣由:241 + 467 = 708
複製代碼
// 前提
function ListNode(val) {
this.val = val;
this.next = null;
}
// 建立兩個鏈表用於測試
var list11 = new ListNode(1);
list11.next = new ListNode(4);
list11.next.next = new ListNode(2);
var list22 = new ListNode(7);
list22.next = new ListNode(6);
list22.next.next = new ListNode(4);
// 參考官網例子 https://leetcode.com/problems/add-two-numbers/solution/
var addTwoNumbers = function(l1, l2) {
var dummyHead = new ListNode(0);
var p = l1,
q = l2,
curr = dummyHead;
var carry = 0;
while (p != null || q != null) {
var x = (p != null) ? p.val : 0;
var y = (q != null) ? q.val : 0;
var sum = carry + x + y;
// 須要對進位取整
carry = Math.floor(sum / 10);
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}
console.log(addTwoNumbers(list11, list22)); // 8->0->7
複製代碼
注意點:bash
不按逆序存在,那鏈表的最後一位是個位,倒數第二位是十位,以此類推。以下所示:測試
// 輸入:(1 -> 4 -> 2) + (7 -> 6 -> 4)
// 輸出:9 -> 0 -> 6
// 緣由:142 + 764 = 906
複製代碼
我想到的一個方式是,先反轉鏈表,再相加,而後把結果再反轉:ui
var reverseLList = function(node) {
// 建立一個頭部節點
var headNode = new ListNode(0);
var end = 0;
while (!end) {
var newlist = new ListNode(node.val);
// 新節點指向頭部節點的next
newlist.next = headNode.next;
// 而後頭部節點指向新節點,這樣當前添加的節點總會在head後面,從而反轉鏈表
headNode.next = newlist;
if (node.next == null) { // 標識是否最後一個節點
end = 1;
}
node = node.next;
}
return headNode.next;
}
console.log(reverseLList(addTwoNumbers(reverseLList(list11), reverseLList(list22))));
// 9->0->6
複製代碼
注意點:this