[链表] - 代码随想录 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)。仅使用两个指针变量,无额外存储空间。

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

相关推荐
Wect4 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP16 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱1 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub1 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP2 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP2 天前
一文搞懂激活函数!
算法·面试