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

🎯 特点

  • 不需要额外空间

  • 不需要计算链表长度

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

相关推荐
普通网友2 小时前
C++中的委托构造函数
开发语言·c++·算法
普通网友2 小时前
C++中的代理模式实战
开发语言·c++·算法
普通网友2 小时前
C++模块化设计原则
开发语言·c++·算法
864记忆2 小时前
Qt c++的基础语法有哪些?
开发语言·c++·qt
龙泉寺天下行走2 小时前
Vscode 配置C++ Mingw调试、编译环境-无需修改系统PATH变量的VS Code配置方法
c++·ide·vscode
AA陈超3 小时前
ASC学习笔记0025:移除所有属性集
c++·笔记·学习·ue5·虚幻引擎
QT 小鲜肉3 小时前
【Linux常用命令大全】在 Linux 系统下 Git + Vim编辑器常用指令完全指南(亲测有效)
linux·开发语言·c++·笔记·git·编辑器·vim
oioihoii4 小时前
现代C++:一场静默的革命,告别“C with Classes”
c语言·jvm·c++
普通网友5 小时前
C++中的组合模式
开发语言·c++·算法