LeetCode Hot100(18/100)——160. 相交链表

文章目录

    • 一、题目描述
    • 二、示例讲解
      • 示例一
    • 三、思维导图
    • 四、解法一:哈希表法
      • 原理说明
      • 流程图展示
      • 时间与空间复杂度
      • Java 实现
    • 五、解法二:双指针法(推荐)
      • 原理说明
      • 示例演示
      • 时间与空间复杂度
      • Java 实现
    • 六、总结

一、题目描述

给定两个单链表 headAheadB,找出并返回这两个链表相交的起始节点。如果两个链表没有交点,则返回 null

链表可能具有 不同的长度,但如果它们相交,会在某个节点之后共享相同的尾部。


二、示例讲解

示例一

假设有如下两个链表:

复制代码
ListA: 4 → 1
             ↘
              8 → 4 → 5
             ↗
ListB:   5 → 6 → 1

它们在节点值为 8 的位置相交,输出应为该节点。


三、思维导图

使用 Mermaid 思维导图可视化题意与解题思路:
两个链表的相交节点
题目理解
两个单链表可能长度不等
若相交则共享尾部部分
否则返回null
解法思路
方法一:哈希表存储节点
方法二:双指针法
复杂度分析
n+m
空间复杂度 O(1) 或 O(n)
关键目标
找出第一个相交节点


四、解法一:哈希表法

原理说明

  1. 首先遍历链表 A,将所有节点加入哈希表。
  2. 然后遍历链表 B,每访问一个节点,检查是否在哈希表中出现过。
  3. 若出现,则该节点即为相交起点;若遍历完未出现,则返回 null

流程图展示



开始
遍历链表A
将每个节点加入哈希表
遍历链表B
节点是否在哈希表中?
返回该节点
继续遍历
遍历结束返回null

时间与空间复杂度

  • 时间复杂度:O(n + m)

    其中 nm 分别为两个链表的长度。

  • 空间复杂度:O(n)

    因为需要使用额外哈希表存储链表 A 的节点。

Java 实现

java 复制代码
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set<ListNode> visited = new HashSet<>();
        ListNode currA = headA;
        while (currA != null) {
            visited.add(currA);
            currA = currA.next;
        }

        ListNode currB = headB;
        while (currB != null) {
            if (visited.contains(currB)) {
                return currB; // 找到相交节点
            }
            currB = currB.next;
        }

        return null; // 无相交点
    }
}

五、解法二:双指针法(推荐)

原理说明

使用两个指针 pApB,分别从链表 A 和 B 的头开始遍历:

  1. 当一个指针到达链表尾端时,从另一条链表的头重新开始。
  2. 两个指针最终会在相交节点相遇,或同时到达 null(不相交)。

这种方法可以"抵消长度差"的影响,使得两个指针在第二次遍历时对齐。

示例演示

指针pB 指针pA 指针pB 指针pA pA 从 headA 开始,pB 从 headB 开始 遍历A 遍历B A到尾时跳到headB B到尾时跳到headA 最终相遇 → 相交节点

时间与空间复杂度

  • 时间复杂度:O(n + m)

    最多遍历两次链表。

  • 空间复杂度:O(1)

    仅使用两个指针,无额外存储。

Java 实现

java 复制代码
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) return null;
        ListNode pA = headA;
        ListNode pB = headB;

        while (pA != pB) {
            pA = (pA == null) ? headB : pA.next;
            pB = (pB == null) ? headA : pB.next;
        }

        return pA; // 可能为相交节点或null
    }
}

六、总结

解法 思路 时间复杂度 空间复杂度 优点 缺点
哈希表法 存储链表A节点再遍历B查找 O(n+m) O(n) 简单直观 额外空间消耗
双指针法 两指针交替遍历抵消长度差 O(n+m) O(1) 空间最优、优雅 不易直观理解初见者
相关推荐
youngerwang1 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby1 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠2 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力3 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly3 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可1233 小时前
SolidWorks草图转三维DWG技巧
算法
redaijufeng3 小时前
C++雾中风景7:闭包
c++·算法·风景
小欣加油4 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
尽兴-5 小时前
2.1 向量基础:Embedding、余弦相似度、欧氏距离、向量检索
算法·embedding·欧氏距离·向量检索·余弦相似度
Black蜡笔小新5 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化