list - 找到 2 个双向链表的交集

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

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

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

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

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

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

最佳答案

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

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

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

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

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

关于list - 找到 2 个双向链表的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64162978/

相关文章:

algorithm - 为什么 Big Theta 在集合 Big O 中,但对于相同的功能却不是相反?

c - C 数组中的合并排序算法 - .exe 未运行?

c - 拆分随机链表然后对它们进行排序

r - 组合两个数据框列表,逐个数据框

python - 根据另一个具有不完整值的较短列表对列表进行排序

c - glibc - 列表和其他数据结构实现

java - 调试 : Mergesort

r - 第二级 R 函数中的子集化

c# - C# 中 Astar (A*) 图搜索数据的结构

python - 递归二叉搜索树插入