📌  相关文章
📜  两个排序链表的交集(1)

📅  最后修改于: 2023-12-03 14:48:52.821000             🧑  作者: Mango

两个排序链表的交集

在处理两个排序链表的交集时,我们需要找到两个链表中共同的节点,并将这些节点链接成一个新的链表。本文将介绍如何使用不同的算法和数据结构来解决这个问题,以及具体的实现方法。

问题描述

给定两个已排序的链表 list1list2,你需要实现一个函数来计算它们的交集,并返回结果链表。

示例

输入:

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分别是两个链表的长度。

总结

本文介绍了解决两个排序链表的交集问题的两种方法:双指针法和哈希表法。根据实际情况选择合适的方法可以帮助我们高效地解决问题。