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

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

相关推荐
菜鸟‍1 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展
退休倒计时2 小时前
【每日一题】LeetCode 142. 环形链表 II TypeScript
算法·leetcode·链表·typescript
popcorn_min2 小时前
Digits 手写数字识别:随机森林多分类 + 像素级特征热力图
算法·随机森林·分类
liulilittle3 小时前
拥塞控制:排水终止的两种决策:OR 与 AND
网络·tcp/ip·计算机网络·算法·信息与通信·tcp·通信
weixin_307779134 小时前
从脚本执行到智能体协作:AI辅助测试能力的范式重构
运维·开发语言·人工智能·算法·测试用例
量化君也4 小时前
从回测到全自动实盘交易,全天候策略需要经历哪些改造?
大数据·人工智能·python·算法·金融
fox_lht4 小时前
第十五章 函数式语言:迭代器和闭包
开发语言·后端·学习·算法·rust
zhengzhouliuhaha5 小时前
智能医疗设备控费系统:以全院一体化管控,筑牢医疗资源“安全阀”
大数据·数据结构·人工智能·算法·安全·机器学习·软件需求
June`5 小时前
CUDA程序效率如何计算以及工具如何使用
算法·cuda
兰令水5 小时前
leecodecode【树形DP】【2026.6.11打卡-java版本】
java·算法·深度优先