23. 链表中环的入口结点

https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&tqId=11208&tPage=1&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&from=cyc_github&tab=answerKey

假设t时刻相遇
t = a+b
2t = a+n(b+c)+b
a = (n-1)(b+c)+c
slow跑(n-1)(b+c)+c
ans从pHead开始跑a
此时两者一定相遇在入口点

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        auto fast = pHead;
        auto slow = pHead;
        while(fast){
            slow = slow->next;
            if(fast->next != nullptr){
                fast = fast->next->next;
            }else{
                return nullptr;
            }
            //有环,开始确定入口点
            if(slow == fast){
                auto ans = pHead;
                while(ans != slow){
                    ans = ans->next;
                    slow = slow->next;
                }
                return ans;
            }
        }
        return nullptr;
    }
};
posted @ 2021-03-27 21:46  rxh1999  阅读(36)  评论(0编辑  收藏  举报