您好,登录后才能下订单哦!
在LeetCode上,求两个链表的第一个公共节点是一个经典的链表问题。这个问题不仅考察了对链表结构的理解,还考察了对指针操作和算法的掌握。本文将详细介绍如何解决这个问题,并提供详细的代码实现和解释。
给定两个单链表 headA
和 headB
,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 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。
要解决这个问题,我们需要找到两个链表的第一个公共节点。由于链表是单向的,我们不能直接从尾部开始遍历。因此,我们需要找到一种方法,使得两个指针能够在相交节点处相遇。
双指针法是一种非常巧妙的解法。具体思路如下:
pA
和 pB
,分别指向链表 headA
和 headB
的头节点。pA
和 pB
每次向后移动一个节点。pA
到达链表 headA
的末尾,则将其指向链表 headB
的头节点;如果 pB
到达链表 headB
的末尾,则将其指向链表 headA
的头节点。pA
和 pB
相遇时,即为两个链表的第一个公共节点。为什么这个方法有效?
假设链表 headA
的长度为 a
,链表 headB
的长度为 b
,两个链表的公共部分长度为 c
。那么,pA
和 pB
分别遍历完自己的链表后,再遍历对方的链表,最终会在公共节点处相遇。因为 pA
和 pB
走过的总长度都是 a + b - c
。
另一种方法是使用哈希表来存储链表 headA
的所有节点,然后遍历链表 headB
,检查每个节点是否在哈希表中。如果存在,则说明该节点是第一个公共节点。
步骤:
headA
,将每个节点存入哈希表中。headB
,检查每个节点是否在哈希表中。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
headA
和 headB
的长度。两个指针最多遍历两个链表各一次。headA
和 headB
的长度。需要遍历两个链表各一次。headA
的所有节点。求两个链表的第一个公共节点是一个经典的链表问题,双指针法和哈希表法是两种常见的解法。双指针法在空间复杂度上更优,而哈希表法在时间复杂度上更直观。在实际应用中,可以根据具体需求选择合适的解法。
通过本文的详细讲解和代码实现,相信读者已经掌握了如何解决这个问题。希望本文对你在LeetCode上的刷题之路有所帮助!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。