JS中mergeTwoLists函数引用传递困惑:操作l为何改变repList?
解惑:JavaScript中引用类型的赋值与操作逻辑
你困惑的核心点在于JavaScript中引用类型的赋值规则,和你理解的"值传递"不是一回事,具体解释如下:
变量存储的本质差异
- 数字、字符串这类基本类型,变量直接存储具体的值,赋值时会复制一份值给新变量,两个变量互不影响。
- 但
ListNode实例这类对象(属于引用类型),变量存储的不是对象本身,而是指向内存中该对象的引用地址。
回到你的代码
执行let l = repList时,并不是把repList对应的对象复制一份给l,而是把repList存储的"内存地址"复制给了l。这意味着:l和repList指向的是内存中同一个ListNode对象。操作属性 vs 重新赋值变量
- 当你执行
l.next = list1这类操作时,是通过l的引用找到内存里的对象,修改它的next属性。因为repList指向同一个对象,所以repList的next属性会同步变化。 - 但如果给
l重新赋值(比如代码里的l = l.next),是把l的引用改成了l.next指向的新对象,此时l和repList不再指向同一个对象,后续修改l的属性就不会影响repList了。
- 当你执行
代码逻辑的合理性
你代码里的逻辑是成立的:用repList锚定最初的空节点,用l遍历构建链表。因为一开始对l.next的修改都作用在repList指向的对象上,最后返回repList.next就能拿到合并后的链表头节点。
内容的提问来源于stack exchange,提问作者Bubullie
相关产品推荐
相关产品推荐

