力扣hot100-160-相交链表

目录

[✅ 暴力解法思路(Brute Force)](#✅ 暴力解法思路(Brute Force))

[✅ C++ 代码:暴力解法](#✅ C++ 代码:暴力解法)

[📌 解释](#📌 解释)

[✅ 双指针解法(Two Pointers)](#✅ 双指针解法(Two Pointers))

核心思想

为什么可行?

[✅ 代码:双指针解法](#✅ 代码:双指针解法)

[🚀 复杂度分析](#🚀 复杂度分析)

[🎯 特点](#🎯 特点)



✅ 暴力解法思路(Brute Force)

暴力解法非常简单:

  1. 从链表 A 的头开始遍历每一个节点 a;

  2. 对每一个 a,再遍历链表 B 的所有节点 b;

  3. 如果 a == b(指针完全相同),说明相交,返回该节点;

  4. 如果结束仍找不到,返回 nullptr。

时间复杂度:O(m × n)

空间复杂度:O(1)

虽然效率不高,但符合题目要求的暴力方式。


✅ C++ 代码:暴力解法

复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        for (ListNode* a = headA; a != nullptr; a = a->next) {
            for (ListNode* b = headB; b != nullptr; b = b->next) {
                if (a == b) {   // 比较指针地址
                    return a;
                }
            }
        }
        return nullptr;
    }
};

📌 解释

  • 不能只比较节点的值,必须比较实际的指针地址,因为不同链表中可能存在值相同但实际上不是同一个节点的情况。

  • 暴力方法确保遍历所有组合,从而找到真正的相交点。


下面给你一种 最经典且高效的双指针解法(时间复杂度 O(m+n), 空间 O(1)),这是面试中最推荐的写法。


✅ 双指针解法(Two Pointers)

核心思想

使用两个指针 pA 和 pB:

  • pA 从 headA 开始;

  • pB 从 headB 开始;

  • 每当前指针走到链表末尾(null),就切换到另一个链表的头继续走。

最终:

  • 如果存在相交点,它们一定会在 同一时间 走到该节点;

  • 如果不存在相交点,它们会同时走到 nullptr。

为什么可行?

两个指针走的总长度相同:

复制代码
pA: A + B  
pB: B + A  

因此最终必然相遇于交点(或同时为 null)。


✅ 代码:双指针解法

复制代码
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (!headA || !headB) return nullptr;

        ListNode* pA = headA;
        ListNode* pB = headB;

        // 两个指针不断前进,末尾切换
        while (pA != pB) {
            pA = (pA == nullptr ? headB : pA->next);
            pB = (pB == nullptr ? headA : pB->next);
        }

        // pA == pB,要么都是相交点,要么都是 nullptr
        return pA;
    }
};

🚀 复杂度分析

项目 复杂度
时间复杂度 O(m + n)
空间复杂度 O(1)

🎯 特点

  • 不需要额外空间

  • 不需要计算链表长度

  • 简洁优雅,面试最佳答案

相关推荐
csdn_aspnet19 分钟前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
小七在进步1 小时前
string的使用(2)
c++
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack4 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
青少儿编程课堂5 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
草莓熊Lotso5 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
David猪大卫1 天前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger1 天前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz1 天前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化1 天前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3