题解 | #链表中环的入口结点#

链表中环的入口结点

http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

/* struct ListNode { int val; struct ListNode next; ListNode(int x) : val(x), next(NULL) { } }; / class Solution { public: ListNode EntryNodeOfLoop(ListNode pHead) {

//方法一:自己做的,先判断有无环,若有环,从根节点开始断开前结点pre(pre==NULL),从当前节点tmp遍历是否有环
//若有环,则恢复上一节点pre的连接pre=tmp,并pre=tmp,tmp=tmp->next,再断开前结点pre,从tmp开始遍历
//知道tmp后的链表无环,此时有结点pre就是环形链表的入口
    
    //先判断有无环
    if(pHead==nullptr||pHead->next==nullptr)
        return nullptr;
    
    ListNode* slow=pHead;
    ListNode* fast=pHead->next->next;
    bool check=false;
    
    while(fast&&fast->next)
    {
        if(slow==fast)
        {
            check=true;
            break;
        }
        fast=fast->next->next;
        slow=slow->next;           
        
    }
    if(check==false)       //无环情况下返回nullptr
        return nullptr;
    

    //有环情况下对环入口结点的寻找
    ListNode* pre=pHead;
    ListNode* tmp=pre->next;
    pre->next=nullptr;
    
    while(true)
    {
        slow=tmp;
        if(tmp->next)
        {  
            fast=tmp->next->next;
        }
        else
            return pre;
        
         check=false;
    
        while(fast&&fast->next)
        {
            if(slow==fast)
            {
                check=true;
                break;
             }
            fast=fast->next->next;
            slow=slow->next;           
        
         }
         if(check==false)       //无环情况下返回nullptr
             return pre;
         else
         {
             //回溯
             pre->next=tmp;
             pre=tmp;
             tmp=tmp->next;
             pre->next=nullptr;
             
         }
    }
    
    
    
    /*
    //方法二,利用有环遍历的规律,若fast和slow的相遇点为tmp,则tmp和头结点pHead以相同速度继续向后遍历
    //同等位数,相等时的结点即为入口节点
    
    //先判断链表为空的情况
    if(pHead == NULL)
        return NULL;
    //快慢双指针
    ListNode* fast = pHead;
    ListNode* slow = pHead;
    //如果没环快指针会先到链表尾
    while(fast != NULL && fast->next != NULL)  
    {
        //快指针移动两步
        fast = fast->next->next;
        //慢指针移动一步
        slow = slow->next;
        //相遇则有环
        if(fast == slow)
            //返回相遇的地方
            break;
    }
    
    //没有环
    if(!fast||(!fast->next))
        return nullptr;
    

    //快指针回到表头
    fast = pHead;
    //再次相遇即是环入口
    while(fast != slow){
        fast = fast->next;
        slow = slow->next;
    }
    return slow;
    */
    
}

};

全部评论

相关推荐

已经入职字节快一个月了,突然想起来之前那段时间的面经没有发,先发一下timeline吧。Tiktok 内容安全平台(人才库电话捞我):电话10.28 -> 一面10.30(我觉得你跟我们组业务挺match的,然后过了三天问hr挂了,应该是别人流程更快)阿里淘天:投递11.11->约面11.12->一面11.14(问得很简单,30分钟,手撕八股全过无后续)Kpi面腾讯wxg 微信小程序:投递11.13 ->约面11.14-> 一面11.17 (究极无敌拷打,问我多模态大模型涉及的算法?但是人很好)->11.19流程终止小红书 风控平台:投递11.16 —约面11.17  ->一面11.18 (抽象的面试官,面试感觉一般,问得前端网页安全相关的,确实没准备)->11.20挂百度 百家号:投递11.14 —>约面11.14 ->一面11.14(当场约2面)->二面11.24->口头告知offer, 拒绝(原因是业务不太好)美团 技术平台投递11.17 -> 约面(忘记了,没多久) ->一面11.19 ->二面11.21 (字节offer不想面了)快手 电商业务投递11.17 -> 约面11.18 ->一面11.19 -> 二面11.21(拒了)腾讯wxg 微信支付(被捞):(直接发面试邮件)技术一面12.05 ->技术二面12.11 ->技术三面12.17 -> hr面已拒绝(了解业务后拒绝,但是有转正hc,感觉还蛮可惜)字节跳动 xxxx:东家就不放具体的时间线了,大概是面完第二天就能知道结果,除了有几天ld请假了没填面评。不去wxg还有个原因是还在期末周,深圳学校来回太麻烦了,至少现在在的组感觉能学到很多的东西,自己的选择应该也没错。还是感概一下,一年前大二的时候投简历海投基本上石沉大海,无论大小厂约面比例很少。现在基本上投了就有面试,还都是以前梦寐以求的大厂,现在自己也有了更多的选择,也没有投太多简历。也感谢上一段实习的经历,很有意思的项目,无论是字节,腾讯,还是美团基本都有聊这个项目。面经需要等一下,也许等周末有空了再发给各位uu,感兴趣可以关注一下~有想要交流学习的同学也可以私信我,目前人在北京大钟寺~,可以找搭子~
正能量的牛可乐:这么多大厂面试下来,不仅摸清了不同公司的面试风格,还能精准避雷业务不匹配的岗位,血赚
实习简历求拷打
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务