LeetCode如何求两个链表的第一个公共节点

发布时间:2021-12-15 13:57:04 作者:小新
来源:亿速云 阅读:136

LeetCode如何求两个链表的第一个公共节点

在LeetCode上,求两个链表的第一个公共节点是一个经典的链表问题。这个问题不仅考察了对链表结构的理解,还考察了对指针操作和算法的掌握。本文将详细介绍如何解决这个问题,并提供详细的代码实现和解释。

问题描述

给定两个单链表 headAheadB,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

示例 2:

输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例 3:

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null。

解题思路

要解决这个问题,我们需要找到两个链表的第一个公共节点。由于链表是单向的,我们不能直接从尾部开始遍历。因此,我们需要找到一种方法,使得两个指针能够在相交节点处相遇。

方法一:双指针法

双指针法是一种非常巧妙的解法。具体思路如下:

  1. 初始化两个指针 pApB,分别指向链表 headAheadB 的头节点。
  2. 同时遍历两个链表,pApB 每次向后移动一个节点。
  3. 如果 pA 到达链表 headA 的末尾,则将其指向链表 headB 的头节点;如果 pB 到达链表 headB 的末尾,则将其指向链表 headA 的头节点。
  4. pApB 相遇时,即为两个链表的第一个公共节点。

为什么这个方法有效?

假设链表 headA 的长度为 a,链表 headB 的长度为 b,两个链表的公共部分长度为 c。那么,pApB 分别遍历完自己的链表后,再遍历对方的链表,最终会在公共节点处相遇。因为 pApB 走过的总长度都是 a + b - c

方法二:哈希表法

另一种方法是使用哈希表来存储链表 headA 的所有节点,然后遍历链表 headB,检查每个节点是否在哈希表中。如果存在,则说明该节点是第一个公共节点。

步骤:

  1. 遍历链表 headA,将每个节点存入哈希表中。
  2. 遍历链表 headB,检查每个节点是否在哈希表中。
  3. 如果找到第一个在哈希表中的节点,则返回该节点。
  4. 如果遍历完链表 headB 都没有找到公共节点,则返回 null

优缺点:

代码实现

双指针法

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        if not headA or not headB:
            return None
        
        pA, pB = headA, headB
        
        while pA != pB:
            pA = pA.next if pA else headB
            pB = pB.next if pB else headA
        
        return pA

哈希表法

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        nodes = set()
        
        while headA:
            nodes.add(headA)
            headA = headA.next
        
        while headB:
            if headB in nodes:
                return headB
            headB = headB.next
        
        return None

复杂度分析

双指针法

哈希表法

总结

求两个链表的第一个公共节点是一个经典的链表问题,双指针法和哈希表法是两种常见的解法。双指针法在空间复杂度上更优,而哈希表法在时间复杂度上更直观。在实际应用中,可以根据具体需求选择合适的解法。

通过本文的详细讲解和代码实现,相信读者已经掌握了如何解决这个问题。希望本文对你在LeetCode上的刷题之路有所帮助!

推荐阅读:
  1. leetcode--合并两个有序的链表
  2. 链表:判断链表是否带环 、求两个链表的相交结点

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

leetcode

上一篇:Qt怎么实现地图监控

下一篇:Qt使用技巧有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》