Optimization 查找两个重复链表的交集

Optimization 查找两个重复链表的交集,optimization,data-structures,linked-list,singly-linked-list,Optimization,Data Structures,Linked List,Singly Linked List,假设我有两个链表 6->14->45->38->52->18->90->null和 78->38->44->6->85->52 这里,第二链表在节点52处与第一链表连接,并且元素38和6也存在于两个链表中。获取这两个链表的交点的最佳方法是什么 查找两个链表的交集,l1和l2的一种简单有效的方法是散列。以下是您可以使用的方法: 创建一个空哈希表h,其中键是节点的地址,该值是一个二进制/布尔值,指示节点是否存在于h中 通过l1并将所有节点的地址插入h 通过l2。对于每个节点,检查它是否存在于h中。如

假设我有两个链表 6->14->45->38->52->18->90->null和 78->38->44->6->85->52


这里,第二链表在节点52处与第一链表连接,并且元素38和6也存在于两个链表中。获取这两个链表的交点的最佳方法是什么

查找两个链表的交集,
l1
l2
的一种简单有效的方法是散列。以下是您可以使用的方法:

  • 创建一个空哈希表
    h
    ,其中键是节点的地址,该值是一个二进制/布尔值,指示节点是否存在于
    h
  • 通过
    l1
    并将所有节点的地址插入
    h
  • 通过
    l2
    。对于每个节点,检查它是否存在于
    h
    中。如果我们在
    h
    中找到一个节点,则该节点与
    l1
    l2
    相交
    该算法具有
    O(m+n)
    时间复杂度和
    O(m)
    额外的辅助空间用于
    h
    ,其中
    m
    l1
    的大小,
    n
    l2
    的大小。您可以在一个集合中添加每个节点的地址,并检查地址是否已经存在,如果任何地址已经在集合中,那么这意味着在该地址处有一个交集,感谢您的解决方案,但是我们可以依赖地址吗,比如说我正在使用java 1。解决方案是否可跨JVM或不同版本2移植。由于GC,对象可以在没有O(1)空间的任何时间移动
    h
    需要O(n)个额外的空间。@JimMischel感谢您的发现,更新了答案。事实上,我错了。
    h
    所需的额外空间是
    l1
    的长度。因此,在您的术语中,额外的空间是
    O(m)