zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    };
  • 相关阅读:
    ffplay代码播放pcm数据
    linux设备驱动
    i2c协议
    macos安裝Ruby
    mac安裝node.js
    Flutter-Wrap流式布局
    Flutter-CircleAvatar圆形和圆角图片
    Flutter-indexstack
    Flutter-Card卡片布局
    Flutter-去除ListView滑動波紋
  • 原文地址:https://www.cnblogs.com/loyolh/p/12599919.html
Copyright © 2011-2022 走看看