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

🎯 特点

  • 不需要额外空间

  • 不需要计算链表长度

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

相关推荐
水天需0103 分钟前
Linux 下查找 UID 的多种方法
c++
Donald_wsn6 分钟前
牛客 栈和排序 C++
数据结构·c++·算法
程序喵大人8 分钟前
记录va_list重复使用导致的crash
开发语言·c++
达子66612 分钟前
git-lfs的安装配置,解决大文件存储问题
linux·c++·git
测试人社区—小叶子14 分钟前
使用开源模型微调,构建专属的测试用例生成机器人
运维·网络·c++·人工智能·机器人·自动化·测试用例
coderxiaohan18 分钟前
【C++】红黑树的实现
数据结构·c++·算法
纵有疾風起20 分钟前
【C++—STL】哈希表底层封装与unorderedset/unorderedmap模拟实现
开发语言·数据结构·c++·stl·哈希算法·散列表
dangdang___go20 分钟前
使用国产AI模型进行“委婉劝学程序”的模拟实现||创建可执行程序营造惊喜感
c语言·c++·豆包·劝学程序开发·创建可执行文件营造惊喜感
coderxiaohan21 分钟前
【C++】封装红黑树实现mymap和myset
数据结构·c++·算法
9ilk40 分钟前
【C++】--- 类型转换
开发语言·c++