1.题目
2.分析:先判断链表是否成环(扩展:为什么快指针的速度是慢指针的两倍)
定义一个步伐为1的慢指针,一个步伐为2的快指针。如果链表成环,两者最终会相遇;
如果没有相遇,则链表不成环;
3.确定成环之后,如何找到入环节点
4.代码
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(slow==fast)
break;
}
if(fast==NULL||fast->next==NULL)//无环
return NULL;
//有环,找节点
struct ListNode *newhead=head;//从原点出发
while(newhead!=fast)//一个从相遇点出发,一个从节点出发,相遇点即为入环点
{
newhead=newhead->next;
fast=fast->next;
}
return fast;
}