C++程序 查找两个有序链表的交集
给定两个按递增顺序排序的链表,创建并返回表示两个列表交集的新列表。新列表应使用自己的内存——原始列表不应更改。
例如:
输入:
第一个链表:1->2->3->4->6
第二个链表:2->4->6->8,
输出: 2->4->6。
元素2、4、6在两个列表中均为共同元素,因此它们出现在交集列表中。
输入:
第一个链表:1->2->3->4->5
第二个链表:2->3->4,
输出: 2->3->4
元素2、3、4在两个列表中均为共同元素,因此它们出现在交集列表中。
方法1: 使用虚拟节点。
实现:
这个方法的思路是在结果列表的开头使用一个临时的虚拟节点。指针tail始终指向结果列表中的最后一个节点,因此可以很容易地添加新节点。虚拟节点最初给tail分配内存空间。这个虚拟节点效率很高,因为它只是临时的,并且它是在stack中分配的。循环过程中,从a或b中删除一个节点,并将其添加到tail中。当给定的列表遍历完成后,结果存储在dummy.next中,因为值从dummy的下一个节点分配。如果两个元素相等,则删除它们并将元素插入到tail中。否则,移除两个列表中元素较小的那个。
以下是上述方法的实现:
输出:
复杂度分析:
- 时间复杂度: O(m+n),其中m和n分别为第一个和第二个链表中的节点数。 只需要对列表进行一次遍历。
- 辅助空间: O(min(m, n))。 输出列表最多可以存储min(m,n)个结点。
方法2: 递归解法。
方法:
递归的方法与以上两种方法非常相似。构建一个递归函数,该函数将两个节点作为参数并返回一个链接列表节点。比较两个链表的第一个元素。
- 如果它们相同,则将递归函数与两个链表的下一个节点一起调用。创建一个带有当前节点数据的节点,并将递归函数返回的节点放入创建的节点的下一个指针中。返回创建的节点。
- 如果两者的值不相等,则删除两个链表中较小的节点并调用递归函数。
下面是上述方法的实现:
输出:
复杂度分析:
- 时间复杂度: O(m+n),其中m和n分别是第一个链表和第二个链表中的节点数。 只需要遍历一次列表。
- 辅助空间: O(max(m, n))。 输出列表至多可以存储m+n个节点。