题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
题目地址
思路
- 快慢双指针
- 快指针 fast 每次移动 2 步,慢指针 slow 每次 1 步;因为存在环,fast 和 slow 总会相遇,此时 fast 刚好比 slow 多走一圈(?)
- 如图,假设他们相遇在 z1 点,此时将 fast/slow 之一重新指向头结点,继续每次一步移动,它们再次相遇的点就是入口
Code
class Solution {
public:
ListNode * EntryNodeOfLoop(ListNode* pHead) {
if (pHead == NULL) return nullptr;
ListNode* slow = pHead;
ListNode* fast = pHead;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) { // 找到环中相遇点
slow = pHead; // 将 fast/slow 中的任一个重新指向头指针
while (slow != fast) { // 直到他们再次相遇,相遇的这个点就是入口
slow = slow->next;
fast = fast->next;
}
return slow;
}
}
return nullptr;
}
};