List 查找两个双链表的交集

List 查找两个双链表的交集,list,algorithm,mergesort,doubly-linked-list,processing-efficiency,List,Algorithm,Mergesort,Doubly Linked List,Processing Efficiency,我有一个任务,我需要找到两个单链接(单对单)列表的交点。我还必须为两个双链接(双链接与双链接)列表执行此操作: 对于单链接列表,我使用mergeSort()对两个列表进行排序,然后逐项比较==>O(m.log(m)+n.log(n)) 我对双重链接列表感到困惑:同样的方法也可以,但我想可能有更快的方法 有人能告诉我是否有更有效的方法来找到两个双链表的交集吗?我想也许我们可以合并它们并检查重复项,但我不确定这将如何工作,效率如何 编辑:请注意,此处的“交叉点”表示共享值,而不是公共节点。

我有一个任务,我需要找到两个单链接(单对单)列表的交点。我还必须为两个双链接(双链接与双链接)列表执行此操作:

  • 对于单链接列表,我使用
    mergeSort()
    对两个列表进行排序,然后逐项比较==>O(m.log(m)+n.log(n))

  • 我对双重链接列表感到困惑:同样的方法也可以,但我想可能有更快的方法

有人能告诉我是否有更有效的方法来找到两个双链表的交集吗?我想也许我们可以合并它们并检查重复项,但我不确定这将如何工作,效率如何

编辑:请注意,此处的“交叉点”表示共享值,而不是公共节点。
编辑:应在不使用散列的情况下执行该实现

如果其中一个列表非常短或比另一个列表短得多,则复杂度O(n*m)的简单嵌套线性扫描可能比排序较长的列表更快。这是非常小的nm(1或0)的最佳方法

对于一般情况,您不能假设列表没有重复项,因此合并列表没有帮助

使用哈希表查找两个列表(单链或双链)的交集,或者更一般地查找两个集合的交集,可能是一种更快的方法:

  • 创建一个可以保存重复项的空哈希表
  • 枚举第一个列表,在哈希表中插入每个元素:O(n)
  • 为每个元素枚举第二个列表,如果在哈希表中找到它,则将其添加到交叉点,并将其从哈希表中删除:O(m)
  • 丢弃哈希表

使用O(n)额外空间,总体时间复杂度为O(n+m)。一个额外的优点是列表不需要使用这种方法进行修改,这可能是一项要求。

我将详细介绍我的评论

假设两个双链接列表相交。然后它们有一个共同的节点。根据该节点的指针确定两个方向上的所有节点,因此列表中的所有节点都是公共的

对于无循环单链接列表,如果它们至少共享一个节点,则按照从该节点到端点的指针确定所有后续节点。这意味着我们可以通过测量列表的长度来找到公共节点,并使用两个指针比较距离末端相等的节点,直到找到第一对相等的节点。这是O(n)时间和O(1)空间


如果存在(或可能存在)一个循环,请使用Floyd的循环查找算法(以及O(n)时间和O(1)空间)来查找它。这些列表共享相同的循环。如果初始节点不在循环中,则按之前的步骤进行(从循环等距开始)。

将第一个列表中的每个项目放入一个集合中。第二个列表也是如此。以两个集合的交集为例。@chqrlie感谢您的回答和详细的解释,但有没有办法不使用散列。我认为我们不能使用它们,因为我们在课堂上没有看到它们。Thanks@lalaland:如果其中一个列表很短,请对小列表中的每个元素使用简单的线性查找,否则对两个列表进行排序并并行扫描是一个很好的练习,可能也是您希望实现的。@lalaland:我认为没有一种简单的方法可以利用双链接列表进行此练习。对双链接列表进行排序非常棘手,将其作为一个单独的相似列表进行排序并通过最终扫描重建反向链接更为简单。@lalaland:可以使用哈希表将元素查找的复杂性降低到O(1)。如果将第二个列表的元素存储到一个已排序的数组中,那么查找操作将需要O(log(m)),因此总的复杂度将变成O(m.log(m))来对第二个数组进行排序,再加上O(n.log(m))来查找第一个列表的元素,组合为O((n+m).log(m)),这比O(n.log(n))+O(m.log(m))稍微好一点如果n远远大于m。但是请注意,排序列表的有效方法是将元素复制到数组中,对数组进行排序,然后重新链接列表。如果两个双链接列表共享任何节点,则它们是相同的,并且每个节点都相交。对于单链接列表,如果它们相交,则共享同一终端节点。测量两个列表的长度,沿着较长的列表移动,直到与末端的距离相等,然后在比较节点对时步调一致。请澄清“交叉点”是什么意思?您是否希望第一个列表中的链接与第二个列表中的链接指向同一对象?还是我们在谈论重复的值?@Stef我对这种模糊性感到抱歉。我说的是重复的值是否适合内存?您可以在线性时间、线性空间中对此使用哈希。@Dave我没有访问哈希的权限。您好@Dave。谢谢你的回答,但我说的是重复值,而不是共同的节点。我很抱歉含糊不清