【链表】链表中环的入口结点(不一定有环)
题目:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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 };