📜  数据结构|链表|问题6(1)

📅  最后修改于: 2023-12-03 15:40:01.514000             🧑  作者: Mango

数据结构 | 链表 | 问题6

问题描述

给定两个单链表,请你找出它们的第一个公共节点。

示例

如下面的两个链表:

A:      a1 → a2
               ↘
                 c1 → c2 → c3
               ↗            
B: b1 → b2 → b3

在节点 c1 开始相交。

解法

本题可以使用双指针法(双指针一定要分开走到尾),分别从两个链表的头部开始,不断往后遍历,当其中一个链表遍历到结尾时,将其指针指向另一个链表的头部,两个指针便相当于同时从两个链表的尾部往前遍历,直到相遇。

代码如下:

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

时间复杂度:O(m + n),其中 m 和 n 分别为两个链表的长度。

空间复杂度:O(1)。

总结

本题考察了链表的知识,并且双指针法是链表问题常用的解法之一,掌握此方法对其他链表问题也是有好处的。