不用截图的示例,比较容易混淆。采用下面代码的例子便可。 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