描述
本题是力扣的160. 相交链表
考点
- 链表的相交
题解
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *curA = headA, *curB = headB;
while (curA != curB) {
curA = curA == nullptr ? headB : curA->next;
curB = curB == nullptr ? headA : curB->next;
}
return curA;
}
};
思路
链表的相交问题需要用到双指针
设链表A的节点为{a1, a2, c1, c2},链表B的节点为{b1, b2, b3, c1, c2};两个链表相交于节点c1,自节点c1起为相交公共部分
假设游标指针curA和curB同时出发,并最终相交于节点c1;观察路径轨迹,可以发现有以下恒等式:
a
1
+
a
2
+
c
1
+
c
2
⏟
c
u
r
A
遍历链表
A
+
b
1
+
b
2
+
b
3
⏟
c
u
r
A
遍历
B
部分
+
c
1
=
b
1
+
b
2
+
b
3
+
c
1
+
c
2
⏟
c
u
r
B
遍历链表
B
+
a
1
+
a
2
⏟
c
u
r
B
遍历
A
部分
+
c
1
\underset{curA\text{遍历链表}A}{\underbrace{a1+a2+c1+c2}}+\underset{curA\text{遍历}B\text{部分}}{\underbrace{b1+b2+b3}}+c1=\underset{curB\text{遍历链表}B}{\underbrace{b1+b2+b3+c1+c2}}+\underset{curB\text{遍历}A\text{部分}}{\underbrace{a1+a2}}+c1
curA遍历链表A
a1+a2+c1+c2+curA遍历B部分
b1+b2+b3+c1=curB遍历链表B
b1+b2+b3+c1+c2+curB遍历A部分
a1+a2+c1
故而,若A、B两个链表存在交点,应做如下操作:
-
curA遍历A链表,然后再从B链表头节点继续遍历
-
curB遍历B链表,然后再从A链表头节点继续遍历
-
curA和curB的遍历同步进行;最终会相遇在相交节点
假如不相交呢?最终curA和curB两个指针值也是相等的,均为nullptr
因为curA先遍历了A链表再遍历了B链表,curB先遍历了B链表再遍历了A链表,两个指针又是同时遍历,自然最终结果一样
更多
恭喜你完成本题!
你可以选择继续下一题,或移步至仓库开始更多类型的挑战:https://fi3wey.github.io/
仓库内包含了更多经典案例的逻辑剖析与实现细节,助你在算法的学习之旅上一往无前!
看官若还满意,还请Star一下哟~
关注公众号峰狂算法
,获取最新的刷题指导呀~