题目描述
一个链表中包含环,请找出该链表的环的入口结点。
分析
使用两个指针,一个跳动1下,另一个跳动2下,最后两个指针会在某一处重合,此时再定义一个新指针从开头开始跳动,刚才的指针也同时开始跳动,两者最后会在入口节点相遇。
代码实现
ListNode* EntryNodeOfLoop2(ListNode* head){
ListNode* slow=head,*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;
//slow指向开头,fast在相遇点
//得到入口点
slow=head;
while(slow!=fast){
slow=slow->next;
fast=fast->next;
}
return slow;
}
ListNode* EntryNodeOfLoop (ListNode* pHead)
{
if(!pHead)
return NULL;
if( pHead->next==NULL)
return NULL;
/必须同时出发
ListNode*p=pHead,*p2=pHead ;
while(1){
p = p ->next; if( p ==NULL) return NULL;
p2= p2->next; if( p2==NULL) return NULL;
p2= p2->next; if( p2==NULL) return NULL;
if(p2==p )
break;
}
ListNode*s1=pHead ,*s2=p2;
while(s1!=s2){
s1 = s1 ->next;
s2 = s2 ->next;
}
return s2;
}
ListNode* slow=head,*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;
//slow指向开头,fast在相遇点
//得到入口点
slow=head;
while(slow!=fast){
slow=slow->next;
fast=fast->next;
}
return slow;
}
ListNode* EntryNodeOfLoop (ListNode* pHead)
{
if(!pHead)
return NULL;
if( pHead->next==NULL)
return NULL;
/必须同时出发
ListNode*p=pHead,*p2=pHead ;
while(1){
p = p ->next; if( p ==NULL) return NULL;
p2= p2->next; if( p2==NULL) return NULL;
p2= p2->next; if( p2==NULL) return NULL;
if(p2==p )
break;
}
ListNode*s1=pHead ,*s2=p2;
while(s1!=s2){
s1 = s1 ->next;
s2 = s2 ->next;
}
return s2;
}