解法:快慢指针
思想:记住画图时候只有a和b两个变量,横是a,圈是b
推出fast和slow都走的是b的倍数
●f 始终= 2s,第一次相遇时f = s + nb,所以第一次相遇时慢指针走了nb步。
●走a + nb步一定在环入口。
所以相遇后,将fast放到head,走a步到环入口,slow走a步为a+nb也在环入口,所以在环入口相遇。
注意:鲁棒性
●需要加上下面代码,因为链表可能无环。
//如果是因为为NULL退出循环,则说明无环,返回NULL
if(fast == NULL || fast->next == NULL)
return NULL;
代码:
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(head == NULL)
return NULL;
ListNode* slow = head;
ListNode* fast = head;
//第一次相遇
while(fast != NULL && fast->next != NULL){
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
break;
}
//如果是因为为NULL退出循环,则说明无环,返回NULL
if(fast == NULL || fast->next == NULL)
return NULL;
fast = head;
//第二次相遇
while(slow != fast){
slow = slow->next;
fast = fast->next;
}
return slow;
}
};