Leetcode No.160 Intersection of Two Linked Lists相交链表(c++实现)
1. 题目
https://leetcode.com/problems/intersection-of-two-linked-lists/
2. 分析
我们可以将列表A和B分别分为三部分,分别为AB公共部分,交点和非公共部分,也就是
- A = A非公共部分 + 交点 + AB公共部分
- B = B非公共部分 + 交点 + AB公共部分
因此
- A + B = A非公共部分 + 交点 + AB公共部分 + B非公共部分 + 交点 + AB公共部分
- B + A = B非公共部分 + 交点 + AB公共部分 + A非公共部分 + 交点 + AB公共部分
观察A+B和B+A,我们可以发现在第二个交点之前,两者的长度必定相同,因此利用这个特点,我们可以设置两个链表指针,一个链表指针先走完A再走B,一个链表指针先走完B再走A,两者最终相遇的地方就是交点,返回第一个指针即可。
特殊情况:
- 若A或B任意一个为空,则直接返回NULL
- 若A,B长度一致,则链表指针不需要走完A或B即可相遇,模型也符合这种情况
- 若A,B没有交点,则链表指针会走完A和B,最终返回NULL,模型符合该情况。
具体代码如下:
class Solution {
public:
bool hasCycle(ListNode* head) {
ListNode* faster = head;//慢指针
ListNode* slower = head;//快指针
while (faster != nullptr && faster->next != nullptr) {
faster = faster->next->next;//快指针一次走两步
slower = slower->next;//慢指针一次走一步
if (faster == slower) {//快慢指针相遇,说明存在环
return true;
}
}
return false;//不存在环的情形
}
};