題目:
分析
返回入環的第一個節點之前我們要判斷是否成環,判斷方法如下
判斷了是否成環之後怎麼找到成環的第一個節點呢,分析如下
代碼
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
//先判斷是不是環,如果是找出第一次相遇的位置
if(head==NULL||head->next==NULL)
return NULL;//成環最少兩個
struct ListNode *slow=head;
struct ListNode *fast=head;
while(fast)
{
slow=slow->next;
if(fast->next==NULL)//防止越界
return NULL;
fast=fast->next->next;
if(slow==fast)//重合了
break;
}
if(fast==NULL)
return fast;
//此時得到第一次相遇的位置
struct ListNode *dst=head;//從原點開始出發
while(1)
{
if(dst==slow)//找到了,返回
return dst;
dst=dst->next;
slow=slow->next;
}
}