【问题标题】:find intersection of 2 doubly linked lists找到两个双向链表的交集
【发布时间】:2021-01-17 14:59:56
【问题描述】:

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

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

  • 我对双向链表感到困惑:同样可以工作,但我想可能有更快的方法。

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

编辑:请注意,此处的“交集”表示共享值,而不是公共节点。 编辑:应该在不使用哈希的情况下完成实现

【问题讨论】:

  • 如果两个双向链表共享任何节点,那么它们是相同的并且每个节点都相交。对于单链表,如果它们相交,则它们共享相同的终端节点。测量两个列表的长度,沿着较长的列表移动,直到与末端等距,然后同步比较节点对。
  • 你能解释一下“交叉点”是什么意思吗?您是否期望第一个列表中的链接指向与第二个列表中的链接相同的对象?还是我们在谈论重复值?
  • @Stef 我很抱歉模棱两可。我说的是重复
  • 这些值是否适合内存?您可以在线性时间、线性空间中为此使用哈希。
  • @Dave 我无权访问哈希。

标签: list algorithm mergesort doubly-linked-list processing-efficiency


【解决方案1】:

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

对于一般情况,您不能假设列表没有重复项,因此合并列表无济于事。

这是一种潜在的更快的方法来查找 2 个列表的交集,单链接或双链接,或者更一般地,使用哈希表找到 2 个集合的交集:

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

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

【讨论】:

  • 将第一个列表中的每个项目放入一个集合中。第二个列表同上。取两组的交集。
  • @chqrlie 感谢您提供详细解释的回答,但有没有办法不使用哈希。我不认为我们可以使用它们,因为我们在课堂上没有看到它们。谢谢
  • @lalaland:如果其中一个列表非常短,请对小列表的每个元素使用简单的线性查找,否则对两个列表进行排序并并行扫描它们是一个很好的练习,可能你预计会实施。
  • @lalaland:我不认为有一种简单的方法可以在这个练习中利用双向链表。对双向链表进行排序非常棘手,将其排序为单点列表并通过最终扫描重建反向链接更简单。
  • @lalaland:可以使用哈希表将元素查找的复杂度降低到 O(1)。如果将第二个列表的元素存储到排序数组中,则查找操作将花费 O(log(m)),因此总复杂度变为 O(m.log(m)) 对第二个数组进行排序加上 O(n.log(m)) 来查找第一个列表的元素,结合 O((n+m).log( m)),如果 n 实质上比 O(n.log(n)) + O(m.log(m)) 略好大于 m。但是请注意,对列表进行排序的一种有效方法是将元素复制到数组中,对数组进行排序,然后重新链接列表。
【解决方案2】:

我将扩展我的评论。

假设两个双向链表相交。然后他们有一个共同的节点。跟随来自该节点的指针确定两个方向上的所有节点,因此列表的所有节点都是公共的。

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

如果存在(或可能存在)一个循环,请使用 Floyd 的循环查找算法(也是 O(n) 时间和 O(1) 空间)来查找它。这些列表共享一个共同的循环。如果初始节点不在循环中,则像以前一样继续(从循环等距离开始)。

【讨论】:

  • 你好@dave。感谢您的回答,但我说的是重复值,而不是共同的节点。我很抱歉模棱两可
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多