Javascript 将两个数字相加,以便于理解

Javascript 将两个数字相加,以便于理解,javascript,Javascript,我在做以下leetcode问题: 给您两个非空的链表,表示两个非负 整数。数字以相反的顺序存储,每个数字 节点包含一个数字。将这两个数字相加,并将其作为 链表 您可以假设这两个数字不包含任何前导零,除了 数字0本身 为此,我偶然发现了以下算法 function ListNode(val) { this.val = val; this.next = null; } //This functiomn is called var addTwoNumbers = funct

我在做以下leetcode问题:

给您两个非空的链表,表示两个非负 整数。数字以相反的顺序存储,每个数字 节点包含一个数字。将这两个数字相加,并将其作为 链表

您可以假设这两个数字不包含任何前导零,除了 数字0本身

为此,我偶然发现了以下算法

function ListNode(val) {
      this.val = val;
      this.next = null;
 }

 //This functiomn is called
var addTwoNumbers = function(l1, l2) {    
    let remainder = 0
    let l3 = {}
    let head = l3
    while (l1 || l2 || remainder) {
        let sum = remainder
        function sumList (linkedList) {
            if (linkedList) {
                sum += linkedList.val
                return linkedList.next
            }
            return null
        }
        l1 = sumList(l1)
        l2 = sumList(l2)
        if (sum>9) {
            remainder = 1
            sum -= 10
        } else {
            remainder = 0
        }

        head.next = new ListNode(sum)
        head = head.next
    }
    return l3.next
};
在这里,我无法理解l3的意义?如果我移除它,algo会失败吗


问题链接:

l3用于记录head的所有更改值。如果我说:

var a = {};
var b = a;
var c = {value: 1, next:{innerValue: 1}};
var d = c;
d.value = 2;
那么b不是它自己的对象。它是指向与a完全相同的对象的指针,因此如果更改b中的值,a也会更新以反映该更改

当您深入研究嵌套对象时,情况仍然如此。如果我说:

var a = {};
var b = a;
var c = {value: 1, next:{innerValue: 1}};
var d = c;
d.value = 2;
然后c更新以反映新的值,正如我已经解释过的。但有趣的是,如果我接着将d指定给嵌套对象并编辑嵌套对象,如下所示:

d = d.next;
d.innerValue = 2;
这仍然更新了c!因此,c保存了所有这些更新的记录,而d可以自由地深入其嵌套对象。运行此代码后,c和d将如下所示:

console.log(c);//{value: 2, next:{innerValue: 2}}
console.log(d);//{innerValue: 2}
这就是l3的功能。l3是头,就像c是d,所以当算法说:

head.next = new ListNode(sum)
head = head.next

…您不必担心丢失历史记录,因为l3会记录所有内容。

l3会记录所有已更改的head值。如果我说:

var a = {};
var b = a;
var c = {value: 1, next:{innerValue: 1}};
var d = c;
d.value = 2;
那么b不是它自己的对象。它是指向与a完全相同的对象的指针,因此如果更改b中的值,a也会更新以反映该更改

当您深入研究嵌套对象时,情况仍然如此。如果我说:

var a = {};
var b = a;
var c = {value: 1, next:{innerValue: 1}};
var d = c;
d.value = 2;
然后c更新以反映新的值,正如我已经解释过的。但有趣的是,如果我接着将d指定给嵌套对象并编辑嵌套对象,如下所示:

d = d.next;
d.innerValue = 2;
这仍然更新了c!因此,c保存了所有这些更新的记录,而d可以自由地深入其嵌套对象。运行此代码后,c和d将如下所示:

console.log(c);//{value: 2, next:{innerValue: 2}}
console.log(d);//{innerValue: 2}
这就是l3的功能。l3是头,就像c是d,所以当算法说:

head.next = new ListNode(sum)
head = head.next

…您不必担心丢失您的历史记录,因为l3会记录所有内容。

l3会保留head的原始值;注意,在循环过程中头部会发生变化。@Pointy仍然无法理解您的评论。你能详细解释一下吗?答案是什么?什么是链表?从未听说过或读过该术语。@connexo@connexo Yeah或类似于const someObj={val:5,next:{val:6:next:null}的对象,其中val包含当前值,next保存下一个节点的值。el3保持head的原始值;注意,在循环过程中头部会发生变化。@Pointy仍然无法理解您的评论。你能详细解释一下吗?答案是什么?什么是链表?从未听说过或读过该术语。@connexo@connexo-Yeah或类似于const-someObj={val:5,next:{val:6:next:null}的对象,其中val包含当前值,next将值保存到下一个节点