📅  最后修改于: 2023-12-03 14:48:52.821000             🧑  作者: Mango
在处理两个排序链表的交集时,我们需要找到两个链表中共同的节点,并将这些节点链接成一个新的链表。本文将介绍如何使用不同的算法和数据结构来解决这个问题,以及具体的实现方法。
给定两个已排序的链表 list1
和 list2
,你需要实现一个函数来计算它们的交集,并返回结果链表。
输入:
list1: 1 -> 2 -> 3 -> 4 -> 5
list2: 2 -> 4 -> 6
输出:
result: 2 -> 4
双指针法是解决链表问题常用的方法之一。对于本问题,我们可以使用两个指针分别指向两个链表的头节点,然后逐个比较节点的值,将相同的值添加到结果链表中。
def find_intersection(list1, list2):
dummy = ListNode(0) # 虚拟头节点
tail = dummy # 结果链表的尾节点
p1, p2 = list1, list2 # 分别指向两个链表的头节点
while p1 and p2:
if p1.val < p2.val:
p1 = p1.next
elif p1.val > p2.val:
p2 = p2.next
else: # p1.val == p2.val,添加节点到结果链表中
tail.next = ListNode(p1.val)
tail = tail.next
p1 = p1.next
p2 = p2.next
return dummy.next # 返回结果链表的头节点
该方法的时间复杂度为O(n+m),其中n和m分别是两个链表的长度。
另一种解决方法是使用哈希表。遍历第一个链表,并将每个节点的值存储在哈希表中,然后遍历第二个链表,检查每个节点的值是否在哈希表中,若存在,则将节点添加到结果链表中。
def find_intersection(list1, list2):
dummy = ListNode(0) # 虚拟头节点
tail = dummy # 结果链表的尾节点
# 将list1中的节点值存储在哈希表中
hash_set = set()
p1 = list1
while p1:
hash_set.add(p1.val)
p1 = p1.next
# 遍历list2,检查节点值是否在哈希表中
p2 = list2
while p2:
if p2.val in hash_set:
tail.next = ListNode(p2.val)
tail = tail.next
p2 = p2.next
return dummy.next # 返回结果链表的头节点
该方法的时间复杂度为O(n+m),其中n和m分别是两个链表的长度。
本文介绍了解决两个排序链表的交集问题的两种方法:双指针法和哈希表法。根据实际情况选择合适的方法可以帮助我们高效地解决问题。