Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Follow up:
Can you solve it without using extra space?
2x = x + L
因此x = L,此时慢指针走的步数就是环的大小L。
在进入环之前,慢指针已经走了s步,则慢指针在环上走了L-s步,也就是说从快慢指针第一次相遇开始,慢指针还有s步就能走到环的起始点了。恰好从链表的起点处走s步也能走到环的起始点,那么我们让另一个指针从链表的起始点开始走,和慢指针一起每次走一步,相遇的地方就是环的起始点了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *fast = head, *slow = head;
while (fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
if (slow == fast)
{
fast = head;
while (fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast;
}
}
return NULL;
}
};