[链表] - 代码随想录 160. 相交链表

[链表] - 代码随想录 160. 相交链表

题目要求

给定两个单链表的头节点 headAheadB,请找出并返回两链表相交的起始节点 ;若两链表无交点,返回 null

解题思路

本题的核心是在常数空间内高效找到相交节点 。常规思路(如哈希表存储节点)会占用 O(n) 额外空间,而双指针法是更优的选择,其核心逻辑基于「总路程相等」的数学原理:

方法原理

  1. 双指针初始化 :两个指针 AB 分别从 headAheadB 头节点出发。
  2. 交替遍历逻辑 :指针走完自身链表后,转走另一个链表(A 走完 headA 转走 headBB 走完 headB 转走 headA)。
  3. 相遇条件
    • 若两链表相交:设 headA 长度为 aheadBb,相交部分长度为 c,则 A 的总路程为 a + (b - c)Bb + (a - c),两者相等,因此会在相交节点处相遇。
    • 若两链表无相交:指针最终会同时走完 a + b 步,均指向 null

实现代码

java 复制代码
/**
 * 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, B = headB;
        // 循环终止条件:指针相遇(交点或同时为null)
        while (A != B) {
            // A指针:非空则走下一步,否则转走headB
            A = (A != null) ? A.next : headB;
            // B指针:非空则走下一步,否则转走headA
            B = (B != null) ? B.next : headA;
        }
        // 返回相遇节点(或null)
        return A;
    }
}

复杂度分析

  • 时间复杂度 :O(m + n),其中 mn 为两链表长度。每个节点最多被访问两次(双指针各一次),总步数为两链表长度之和。
  • 空间复杂度:O(1)。仅使用两个指针变量,无额外存储空间。

该方案通过双指针的交替遍历,既保证了时间效率,又避免了额外空间开销,是本题的最优解之一。

相关推荐
Ka1Yan2 小时前
[链表] - 代码随想录 206. 反转链表
数据结构·链表
学嵌入式的小杨同学2 小时前
C 语言实战:动态规划求解最长公共子串(连续),附完整实现与优化
数据结构·c++·算法·unity·游戏引擎·代理模式
rgeshfgreh2 小时前
顺序表实战:构建到销毁全解析
算法
十八岁讨厌编程2 小时前
【算法训练营Day32】图论专题
算法·深度优先·图论
小欣加油2 小时前
leetcode 174 地下城游戏
c++·算法·leetcode·职场和发展·动态规划
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章11-高斯滤波
图像处理·人工智能·opencv·算法·计算机视觉
Ka1Yan2 小时前
[链表] - 代码随想录 203. 移除链表元素
数据结构·链表
不知名XL2 小时前
day23 贪心算法 part01
算法·贪心算法
wuqingshun3141593 小时前
蓝桥杯 缺页异常2【算法赛】
算法·职场和发展·蓝桥杯