找到两个双向链表的交集

问题描述

我有一个作业,需要找到2个单链接(单对单)列表的交集。我还必须对2个双向链接(双向vs双向)列表执行此操作:

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

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

有人可以告诉我是否有一种更有效的方法来查找两个双向链表的交集吗?我以为也许我们可以合并它们并检查重复项,但是我不确定这样做如何以及效率如何。

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

解决方法

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

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

这是使用散列表查找两个列表(单链或双链)的交点或更普遍的两个集合的交点的可能更快的方法:

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

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

,

我将继续评论。

说两个双向链接的列表相交。然后它们有一个共同的节点。跟随该节点的指针确定两个方向上的所有节点,因此列表具有所有相同的节点。

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

如果存在(或可能存在)一个循环,请使用弗洛伊德的循环查找算法(也是O(n)时间和O(1)空间)来找到它。清单共有一个周期。如果初始节点不在循环中,请像以前一样进行操作(从循环等距开始)。