剑指offer55-链表中环的入口结点

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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;
    }
};
原文地址:https://www.cnblogs.com/loyolh/p/12599919.html