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

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

相关推荐
w_zero_one1 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼2 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
小超人诞生日记3 小时前
C++ 智能指针的使用及其原理详解
c++·算法
AiNightVision6 小时前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件
牧羊人.3337 小时前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn
小郎君6588 小时前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法
JJJennie7778 小时前
MAI Gateway私有化部署全攻略:大模型网关如何接入?附架构图
算法·gateway·ai网关·魔芋ai
東隅已逝,桑榆非晚8 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
专注仿真8 小时前
卷积神经网络(CNN)算法详解
人工智能·python·算法·代码·大模型训练