链表中环的入口结点

具体分析可见http://blog.csdn.net/libin1105/article/details/48267113

需要指出的是,上述博客中2*(a+b)=a+b+c+b应该改为2*(a+b)=a+b+(c+b)*n,其中n为自然数。

然后得到关系式a=(b+c)*n-b

由此可见两个指针会相遇在环的入口。

 1 class Solution {
 2 public:
 3     ListNode* EntryNodeOfLoop(ListNode* pHead)
 4     {
 5         if(pHead==NULL||pHead->next==NULL)
 6             return NULL;
 7         ListNode* one=pHead;
 8         ListNode* two=pHead;
 9         do{
10             two=two->next;
11             two=two->next;
12             one=one->next;
13         }while(one!=two);
14         ListNode* newone=pHead;
15         while(two!=newone)
16         {
17             newone=newone->next;
18             two=two->next;
19         }
20         return two;
21     }
22 };
View Code

 

posted @ 2016-03-28 16:27  vaevaevae  阅读(128)  评论(0编辑  收藏  举报