【发布时间】:2021-04-19 05:06:11
【问题描述】:
我一直在研究 leetcode,遇到了这个问题https://leetcode.com/problems/intersection-of-two-linked-lists/,它要求你找到两个 LinkedList 的交集。一个解决方案(不是我所知道的最好的)是使用散列集来跟踪第一个链表,同时遍历它,然后遍历第二个链表。当我们发现有一个重复节点时,那就是交叉点。
比如E就是路口
A -> B
\
E -> F
/
C -> D
我解决的方法是使用WeakSet作为哈希集来存储第一个链表的引用。
这里是代码
var getIntersectionNode = function(headA, headB) {
let hashSet = new WeakSet()
while(headA){
hashSet.add(headA)
headA = headA.next
}
while(headB){
if(hashSet.has(headB)) return headB
headB = headB.next
}
return null
};
我的问题是,因为WeakSet 有这个很好的特性——当没有其他对存储在 WeakSet 中的对象的引用时,这些对象可以被垃圾回收。如果我们回到这里的示例,当我们遍历A -> B -> E -> F 时,我们将每个节点都添加到哈希集中,但我们不会保留每个节点的引用,即headA = headA.next。这意味着在我将一个节点添加到哈希集中并前进到下一个节点后,对前一个节点的引用消失了,那么它应该从哈希集中进行垃圾收集对吗?那么解决方案怎么会通过呢?
例如,当我们在A时,我们将A存储到哈希集中,然后我们前进到B,现在没有办法引用回A,用WeakSet它应该被垃圾收集。但很明显,如果是这种情况,解决方案就行不通了。有人能指出我的理解哪里错了吗?
【问题讨论】:
-
“那么应该是从哈希集中收集垃圾吧?那解决方案怎么会通过?”你为什么相信为你提供链接列表的代码然后检查您的解决方案本身是否保留对链接列表的引用?
标签: javascript algorithm linked-list