目录
[✅ 暴力解法思路(Brute Force)](#✅ 暴力解法思路(Brute Force))
[✅ C++ 代码:暴力解法](#✅ C++ 代码:暴力解法)
[📌 解释](#📌 解释)
[✅ 双指针解法(Two Pointers)](#✅ 双指针解法(Two Pointers))
[✅ 代码:双指针解法](#✅ 代码:双指针解法)
[🚀 复杂度分析](#🚀 复杂度分析)
[🎯 特点](#🎯 特点)

✅ 暴力解法思路(Brute Force)
暴力解法非常简单:
-
从链表 A 的头开始遍历每一个节点 a;
-
对每一个 a,再遍历链表 B 的所有节点 b;
-
如果 a == b(指针完全相同),说明相交,返回该节点;
-
如果结束仍找不到,返回
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) |
🎯 特点
-
不需要额外空间
-
不需要计算链表长度
-
简洁优雅,面试最佳答案