【題目描述】
一個鏈表中包含環,請找出該鏈表的環的入口結點。
【解題思路】

有一個單鏈表,其中可能有一個環,也就是某個節點的next指向的是鏈表中在它之前的節點,這樣在鏈表的尾部形成一環。
那么問題來了,如何判斷一個鏈表是不是這類鏈表?如果鏈表為存在環,如果找到環的入口點? 當fast若與slow相遇時,slow肯定沒有走遍歷完鏈表(不是一整個環,有開頭部分,如上圖)或者恰好遍歷一圈(未做驗證,看我的表格例子,在1處相遇)。於是我們從鏈表頭、相遇點分別設一個指針,每次各走一步,兩個指針必定相遇,且相遇第一點為環入口點(慢指針走了n步,第一次相遇在c點,對慢指針來說n=s+p,也就是說如果慢指針從c點再走n步,又會到c點,那么順時針的CB距離是n-p=s,但是我們不知道s是幾,那么當快指針此時在A點一步一步走,當快慢指針相遇時,相遇點恰好是圓環七點B(AB=CB=s))。
那么問題來了,如何判斷一個鏈表是不是這類鏈表?如果鏈表為存在環,如果找到環的入口點? 當fast若與slow相遇時,slow肯定沒有走遍歷完鏈表(不是一整個環,有開頭部分,如上圖)或者恰好遍歷一圈(未做驗證,看我的表格例子,在1處相遇)。於是我們從鏈表頭、相遇點分別設一個指針,每次各走一步,兩個指針必定相遇,且相遇第一點為環入口點(慢指針走了n步,第一次相遇在c點,對慢指針來說n=s+p,也就是說如果慢指針從c點再走n步,又會到c點,那么順時針的CB距離是n-p=s,但是我們不知道s是幾,那么當快指針此時在A點一步一步走,當快慢指針相遇時,相遇點恰好是圓環七點B(AB=CB=s))。
【代碼實現】
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 }; 9 */ 10 class Solution { 11 public: 12 ListNode* EntryNodeOfLoop(ListNode* pHead) 13 { 14 if(pHead==NULL) 15 return NULL; 16 ListNode* pAhead=pHead; 17 ListNode* pBehind=pHead; 18 while(pAhead!=NULL&&pAhead->next!=NULL) 19 { 20 pAhead=pAhead->next->next; 21 pBehind=pBehind->next; 22 if(pAhead==pBehind) 23 break; 24 } 25 26 if(pAhead==NULL||pAhead->next==NULL) 27 return NULL; 28 29 pAhead=pHead; 30 while(pAhead!=pBehind) 31 { 32 pAhead=pAhead->next; 33 pBehind=pBehind->next; 34 } 35 return pBehind;//return pAhead; 36 } 37 };