【链表】链表中环的入口结点(不一定有环)

题目:

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

 

解答:

思路:

    设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点(结论1)。接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口(结论2)。以下是两个结论证明:

两个结论:

1、设置快慢指针,假如有环,他们最后一定相遇。
2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。
 3 
 4 class Solution {
 5 public:
 6     ListNode* EntryNodeOfLoop(ListNode* pHead)
 7     {
 8         ListNode*fast=pHead,*low=pHead;
 9         while(fast&&fast->next){
10             fast=fast->next->next;
11             low=low->next;
12             if(fast==low)
13                 break;
14         }
15         if(!fast||!fast->next)return NULL;
16         low=pHead;//low从链表头出发
17         while(fast!=low){//fast从相遇点出发
18             fast=fast->next;
19             low=low->next;
20         }
21         return low;
22     }
23 };

 

posted @ 2020-05-06 16:30  梦醒潇湘  阅读(170)  评论(0)    收藏  举报