给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
说明:不允许修改给定的链表。
思路分析:求环的入口点,如果带环,就会有一个相遇点,此时让慢指针从相遇点开始走,同时头指针也向后走,直到头指针和慢指针相遇时,就是环的入口点
证明:
具体代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode* meet=NULL;
struct ListNode* slow=head;
struct ListNode* fast=slow;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
meet=slow;
break;
}
}
if(meet==NULL)
{
return NULL;
}
while(meet&&head)
{
if(meet==head)
{
return meet;
}
meet=meet->next;
head=head->next;
}
return NULL;
}