解题思路
题目中的相交指的是同时走到同一个节点上,可以通过拼接链表的方式来解决这个问题。
设链表A的前半部分为a
,链表B的前半部分为b
, 后半的相交部分为c
。也就是说当链表A走在相交处的时候链表B也必定同时走在相交处。
算法过程
- 同时遍历链表A,链表B
- 链表A走完后就走链表B,链表B走完后就走链表A
- 由于链表A走到a + c , 链表B走到b + c的时候,链表B比链表A多走了一步,再把链表A指向链表B,链表B指向链表A,a + c + b = b + c + a,链表A与链表B必然会在某一点相交
ha==hb
- 一旦
ha==hb
,遍历结束返回相交点,这个点必然是它们相交的起始点。 - 如果这两个链表不相交,那ha最终会指向null,hb也将指向null。 返回
ha
即可
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
ha,hb = headA, headB
while ha != hb:
ha = ha.next if ha else headB
hb = hb.next if hb else headA
return ha
复杂度分析
- 时间复杂度: O(M+N)
- 空间复杂度: O(1)