两个链表的并集和交集

2024年8月28日 | 阅读 7 分钟

创建列表的并集和交集,包含两个给定链表中存在的元素的并集和交集。输出列表中元素的排列方式无关紧要。

示例

示例-1

输出

Intersection List: 4->10
Union List: 2->8->20->4->15->10 

方法 1: 简单

代码

输出

First list is 
10 15 4 20
Second list is 
8 4 2 10
Intersection list is 
4 10
Union list is 
2 8 20 4 15 10

复杂性分析

时间复杂度

时间复杂度 O(m*n)。

其中,“m”和“n”分别指第一和第二个链表中的元素总数。

对于并集,我们检查 list-2 中的每个元素是否已存在于使用 list-1 创建的结果列表中。

对于交集,我们检查 list-1 中的每个元素是否也存在于 list-2 中。

额外空间: O (1)。

未使用任何数据结构来存储值。

方法 2: 使用归并排序

此方法中用于交集和并集的方法非常相似。在对提供的链表进行排序后,我们遍历排序后的链表以获得并集和交集。

以下是为获得交集和并集列表需要执行的操作。

使用归并排序对第一个链表进行排序。此步骤需要 O(mLogm) 时间。有关此阶段的信息,请参阅此文章。

使用归并排序对第二个链表进行排序。此步骤需要 O(nLogn) 时间。有关此阶段的信息,请参阅此文章。

使用线性搜索,找到两个排序链表的交集和并集。此步骤需要 O(m + n) 时间。用于排序数组的相同算法可用于此阶段。

此方法的总时间复杂度为 O(mLogm + nLogn),比方法 1 的时间消耗少。

方法 3: 散列

并集 (list1, list2)

创建一个空的哈希表,并将结果列表初始化为 NULL。在遍历两个链表时,逐个检查每个元素是否在哈希表中。如果元素不存在,则将其添加到结果列表中。如果元素存在,则忽略它。

交集 (list1, list2)

创建一个空的哈希表,并将结果列表初始化为 NULL。遍历 list-1。检查 list-1 中的每个元素,并将其插入哈希表中。在遍历 list-2 时,逐个查找哈希表中的每个元素。如果元素存在于哈希表中,则将其插入结果列表中。如果元素不存在,则忽略它。

以上两种方法都假设没有重复项。

代码

输出

First List is
10 15 4 20 
Second List is
8 4 2 10 
Intersection List is
10 4 
Union List is
2 4 20 8 10 15

复杂性分析

时间复杂度

时间复杂度 O(m+n)。

其中,“m”和“n”分别指第一和第二个链表中的元素总数。

并集需要遍历两个链表,将元素存储在哈希映射中,并更新每个计数。

对于交集:应遍历 list-1,将其元素存储在哈希映射中,然后检查 list-2 中的每个元素是否已存在于映射中。这需要 O(1) 的时间延迟。

对于交集,我们检查 list-1 中的每个元素是否也存在于 list-2 中。

额外空间: O (m+n)。

使用哈希映射数据结构来存储值。