题目大意:给定一个单链表,找出其环路的起始点。若不存在环路,则返回NULL。
大概思路:数学题
头结点是A,题目要求的环路起点为B,在141题快慢指针算法中求出的相遇点为C。
设A到B的距离为a,B到C的距离为b,环路一圈的距离为c。
则(a+b)*2=a+b+k*c;(其中k为常数)
则a+b=k*c;
两个指针分别以相同速度从A、B出发,第一个指针到达B点,路程为a,第二个指针此时走的路程也为a=k*c-b,即也到达了B点,可知两个指针在B点相遇。
code:
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *fast=head;
struct ListNode *slow=head;
if(!head||!(head->next)) return NULL;
while((fast->next)&&(fast->next->next)){
fast=fast->next->next;
slow=slow->next;
if(fast==slow){
break;
}
}
if(!(fast->next)||!(fast->next->next)) return NULL;
else{
slow=head;
while(slow!=fast){
slow=slow->next;
fast=fast->next;
}
return slow;
}
}