题目:环形链表
两个问题:是否有环?环的入口在哪儿
1、是否有环
快慢指针,快指针速度2,慢指针速度1,二者都进环后,快追慢,相对速度1,一定能追上。
2、找环的入口
快指针至少跑一圈才能追上慢指针,慢指针相遇时只跑了一圈。本质上要求x,找出等式关系
相遇时:2(x+y) = x+y+n(y+z) x+y = n(y+z) x = n(y+z)-y = (n-1)(y+z)+z
快指针从相遇的位置跑了n圈后,再跑z步,就会和从头出发的指针在环形入口时相遇。
/**
* 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;
ListNode* slow = head;
//注意判断条件
while(fast != NULL && fast->next != NULL){
slow = slow->next;
fast = fast->next->next;
if(fast == slow){
ListNode* index1 = head;
ListNode* index2 = fast;
while(index1 != NULL && index2 != NULL){
//题目要求是返回入口节点,直接返回节点的指针
if(index1 == index2) return index1;
index1 = index1->next;
index2 = index2->next;
}
}
}
return NULL;
}
};