题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null
思路:(一开始不会,看了其他网友的才自己弄明白的)
1.
该图来源于https://blog.csdn.net/HelloZEX/article/details/81087398。
先设两个指针,一个快指针(每次走两步),一个慢指针(每次走一步)。
2. 两个指针都从头结点开始走,假设两点在某点相遇。此时慢指针走了w+y步,快指针走了w+y+n(正好比慢指针多走了一圈)或者w+y+xn步(和慢指针相遇时快指针已经走了x圈)。由2(w+y)=w+y+n得n=w+y,或由2(w+y)=w+y+xn得xn=w+y.
3. 让慢指针从头结点开始走,让快指针从相遇结点开始走,(补充一下,此时快慢指针每次都走一步)直到相遇结点即为入口结点。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { if(pHead==NULL){ return NULL; } ListNode* fp = pHead; //快指针,每次走两步 ListNode* sp = pHead; //慢指针,每次走一步 while(fp->next!=NULL && fp->next->next!=NULL){ sp = sp->next; fp = fp->next->next; if(sp==fp){ sp = pHead; while(sp!=fp){ sp = sp->next; fp = fp->next; } return fp; } } return NULL; } };