LC 160链表简单第 31 / 95 题

相交链表

Intersection of Two Linked Lists

双指针等距交换
本机进度仅保存在当前浏览器

题目描述

给你两个单链表的头节点 headA 与 headB,请你找出并返回两个单链表相交的起始节点;若不相交返回 null。整个链式结构中不存在环。要求 O(n) 时间、O(1) 空间。

示例:两链表在值为 8 的节点相交。

解题思路

  1. 两链表长度不同,直接同步走无法对齐;核心是消除长度差。
  2. 指针 p 从 A 出发、q 从 B 出发,各自走到底后跳到另一条链表的头继续走。
  3. 这样两者走过的总长度同为 la + lb,长度差被"换轨"抵消;若相交必然在交点相遇,不相交则同时到达 null。
  4. 也可以先算长度差让长链先走差值步,本质相同。

参考实现

查看参考实现Python · 建议先自行作答
def getIntersectionNode(headA, headB):
    # 双指针换轨:走完自己的路再走对方的路,等距消除长度差
    p, q = headA, headB
    while p is not q:
        p = p.next if p else headB
        q = q.next if q else headA
    return p

复杂度与归属

时间复杂度O(m + n)
空间复杂度O(1)
所属分类链表
题源LeetCode 160

关联教程

返回题图鉴