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) 空间最优、优雅 不易直观理解初见者
相关推荐
仰泳的熊猫2 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码6 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发6 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre7 小时前
22 括号生成
算法·深度优先
努力也学不会java8 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎8 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan8 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业9 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe9 小时前
C++并发编程中的死锁避免
开发语言·c++·算法