题目
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
链接: link.
解题思路
本题应用快慢指针的方法;创建两个指针,两个指针都指向链表的头;
struct ListNode *slow=head;
struct ListNode *fast=head;
slow每次走一步 ,fast每次走两步;当链表存在环路,slow进入环路时,每走一次fast与slow的距离就会减1;因此fast必定会与slow在环中相遇。
根据他们第一次相遇是的位置我们可以得到以下方程:
(L+X)*2=N*C+L+C
整理得到:
L=(N-1)*C+C-X
根据上面的方程我们可以知道,当head每次走一步走到进环点时,slow的也刚好走到该点。也就是本题要求的进入环的第一个节点。
解题代码
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *slow=head;
struct ListNode *fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(fast==slow)
{
struct ListNode *meet=slow;
while(head!=meet)
{
head=head->next;
meet=meet->next;
}
return meet;
}
}
return false;
}