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

链表中环的入口结点

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

//参考了剑指offer上讲解的快慢指针法。核心思路分3步:
//1.先确定有无环:快指针一次走2步,慢指针走1步,发生重逢说明有环。
//2.确定环的长度:重逢一定是在环中发生的,从重逢的位置开始,用个temp一直往前推进,直到回到这个位置,记录这个过程中走了多少步,这就是环的长度。
//3.移动到环开始的位置:让快指针从head开始走n步(n为环长度),相当于让慢指针落后n步,这样当快指针绕环走完一圈回来后正好能赶上慢指针刚抵达环的开头。
class Solution {
public:
    ListNode* HasLoop(ListNode* p)
    {
        if(p==nullptr)
        {
            return nullptr;
        }
        ListNode* slow=p;
        ListNode* fast=p;
        while (fast!=nullptr && fast->next!=nullptr) {
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow)
                return fast;//说明有环。
        }
        return nullptr;//无环
    }

    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode* OneNodeInLoop=HasLoop(pHead);//找到环中的某一个节点。
        if(OneNodeInLoop==nullptr)
            return nullptr;
        ListNode* temp=OneNodeInLoop;
        int LoopLength=0;//环的长度。
        do {
            temp=temp->next;
            LoopLength++;
        }while(temp!=OneNodeInLoop);
        ListNode* slow=pHead;
        ListNode* fast=pHead;
        for(int i=LoopLength;i>0;i--)
        {
            fast=fast->next;//先将fast往前挪n步,n为环的长度。也可以理解为让slow少走一个环的距离,这样在fast绕环走完一圈后,slow才刚好赶到,这样就正好重合了。
        }
        while (fast!=slow) {//让slow与fast同速前进,直到重逢
            fast=fast->next;
            slow=slow->next;
        }
        return fast;
    }
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:32
点赞 评论 收藏
分享
来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
07-15 14:14
门头沟学院 Java
7.10投递7.15感谢信
投递地平线等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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