力扣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)

核心思想

使用两个指针 pApB

  • pAheadA 开始;

  • pBheadB 开始;

  • 每当前指针走到链表末尾(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)

🎯 特点

  • 不需要额外空间

  • 不需要计算链表长度

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

相关推荐
微露清风6 小时前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
CSARImage7 小时前
C++读取exe程序标准输出
c++
一只小bit7 小时前
Qt 常用控件详解:按钮类 / 显示类 / 输入类属性、信号与实战示例
前端·c++·qt·gui
一条大祥脚7 小时前
26.1.9 轮廓线dp 状压最短路 构造
数据结构·c++·算法
项目題供诗8 小时前
C语言基础(一)
c++
@areok@9 小时前
C++opencv图片(mat)传入C#bitmap图片
开发语言·c++·opencv
鸽芷咕9 小时前
【2025年度总结】时光知味,三载同行:落笔皆是沉淀,前行自有光芒
linux·c++·人工智能·2025年度总结
羑悻的小杀马特9 小时前
指尖敲代码,笔尖写成长:2025年度总结与那些没说出口的碎碎念
linux·c++·博客之星·2025年度总结
linweidong9 小时前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
cpp_25019 小时前
P2708 硬币翻转
数据结构·c++·算法·题解·洛谷