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

🎯 特点

  • 不需要额外空间

  • 不需要计算链表长度

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

相关推荐
-dzk-5 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
m0_706653236 小时前
C++编译期数组操作
开发语言·c++·算法
qq_423233906 小时前
C++与Python混合编程实战
开发语言·c++·算法
m0_715575346 小时前
分布式任务调度系统
开发语言·c++·算法
CSDN_RTKLIB7 小时前
简化版unique_ptr说明其本质
c++
naruto_lnq7 小时前
泛型编程与STL设计思想
开发语言·c++·算法
m0_748708058 小时前
C++中的观察者模式实战
开发语言·c++·算法
时光找茬8 小时前
【瑞萨AI挑战赛-FPB-RA6E2】+ 从零开始:FPB-RA6E2 开箱测评与 e2 studio 环境配置
c++·单片机·边缘计算
qq_537562678 小时前
跨语言调用C++接口
开发语言·c++·算法
猷咪8 小时前
C++基础
开发语言·c++