【LeetCode】相交链表:双指针法,一次遍历找到交点

题目

给你两个单链表的头节点 headAheadB,找出并返回两个单链表相交的起始节点 。如果两个链表不存在相交节点,返回 null

注意: ​ 相交是指引用相同,不是值相同。


思路

这道题最巧妙的解法是双指针法,核心思想就一句话:

两个指针分别走完自己的路,然后走上对方的路,如果有交点,它们一定会在交点相遇。

为什么能相遇?

假设:

  • 链表 A 的非公共部分长度为 a

  • 链表 B 的非公共部分长度为 b

  • 公共部分长度为 c

指针 A 走的路径:a + c + b

指针 B 走的路径:b + c + a

两条路径长度一样,如果有交点,它们在走完 a + b + c 步后一定同时到达交点。

如果没有交点,两个指针都会走完 a + b 步后同时变成 null,循环结束,返回 null


代码

复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode A = headA;
        ListNode B = headB;

        while (A != B) {
            // A 走到头就切换到 B 的头
            if (A == null) {
                A = headB;
            } else {
                A = A.next;
            }

            // B 走到头就切换到 A 的头
            if (B == null) {
                B = headA;
            } else {
                B = B.next;
            }
        }

        return A;
    }
}

执行过程示例

复制代码
A: 1 → 2 → 3 → 4
B:       6 → 3 → 4
步数 指针 A 指针 B
初始 1 6
1 2 3
2 3 4
3 4 null → 切换到 headA
4 null → 切换到 headB 1
5 6 2
6 3 3 ✅ 相遇,返回交点

关键点

细节 为什么
while (A != B) 相等时要么都指向交点,要么都指向 null
走完切换链表 保证两个指针走的路程一样长
比较的是引用 == 题目说相交是引用相同,不是值相同

复杂度

  • 时间复杂度:O(m + n),每个指针最多走 m + n + 1 步

  • 空间复杂度:O(1),只用了两个指针


总结

这题的精髓在于:让两个指针走相同的路程,有交点必相遇,没交点同归 null。

相关推荐
zander2581 小时前
LeetCode 5. 最长回文子串
算法
hanlin032 小时前
刷题笔记:力扣第84题-柱状图中最大的矩形
笔记·算法·leetcode
青少儿编程课堂3 小时前
威佐夫博弈(双堆取子游戏)解析
c++·python·算法·bfs·信息学竞赛
辰烨chenye7 小时前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
hqyjzsb11 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye11 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术11 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
sanjiaomao33311 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
乐迪信息12 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪