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

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

题目要求

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

解题思路

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

方法原理

  1. 双指针初始化 :两个指针 A、B 分别从 headA、headB 头节点出发。
  2. 交替遍历逻辑 :指针走完自身链表后,转走另一个链表(A 走完 headA 转走 headB,B 走完 headB 转走 headA)。
  3. 相遇条件 :
    • 若两链表相交:设 headA 长度为 a、headB 为 b,相交部分长度为 c,则 A 的总路程为 a + (b - c),B 为 b + (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),其中 m、n 为两链表长度。每个节点最多被访问两次(双指针各一次),总步数为两链表长度之和。
  • 空间复杂度:O(1)。仅使用两个指针变量,无额外存储空间。

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

相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法