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

题目

给你两个单链表的头节点 headA 和 headB,找出并返回两个单链表相交的起始节点 。如果两个链表不存在相交节点,返回 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。

相关推荐
GoAI3 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi3 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M6 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen6 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷8 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方8 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん9 小时前
【C++】哈希表
c++·算法·散列表
地平线开发者10 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
武子康12 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法