利用快慢指针方法判断链表是否存在环,并记录两指针相遇位置。

linked-list-cycle-ii

https://www.nowcoder.com/practice/6e630519bf86480296d0f1c868d425ad?tpId=46&tqId=29038&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking

题目描述:对于一个给定的链表,返回环的入口节点,如果没有环,返回null

快慢指针方法:将两指针分别放在链表头(X)和相遇位置(Z),并改为相同速度推进,则两指针在环开始位置相遇(Y),如图所示。

证明过程:X,Y,Z分别为链表起始位置,环开始位置和两指针相遇位置,由快指针速度的慢指针速度的2倍。

快指针与慢指针均从X出发,在Z相遇。此时,慢指针行使距离为a+b,快指针为a+b+n(b+c)。
所以2*(a+b)=a+b+n*(b+c),推出
a=(n-1)*b+n*c=(n-1)(b+c)+c;
得到,将此时两指针分别放在起始位置和相遇位置,并以相同速度前进,当一个指针走完距离a时,另一个指针恰好走出 绕环n-1圈加上c的距离。
public class Solution{
    public ListNode detectCycle(ListNode head){
        ListNode slow=head;
        ListNode fast=head;
        
        while(fast!=null&&fast.nest!=null){
            fast=fast.next.next
            slow=slow.next;
            
            if(fast==slow){                 //利用快慢指针找相遇点
                ListNode slow2=head;    //设置以相同速度的新指针从起始位置出发
                while(slow2!=slow){      //未相遇循环。
                    slow=slow.next;
                    slow2=slow2.next;
                }
                return slow;
            }
        }
        return null;
    }
    
}




全部评论
为什么是2(a+b)啊
3 回复 分享
发布于 2020-10-01 10:37
觉得还是有必要验证一下,慢指针一圈都没走完这个点。
2 回复 分享
发布于 2021-01-23 09:52
while括号里fast.next写成了fast.nest 下面一行少了个分号
2 回复 分享
发布于 2021-01-22 10:46
牛逼
1 回复 分享
发布于 2020-11-15 20:58
速度设定为2倍速,不怕跳过,相遇不到吗?
点赞 回复 分享
发布于 2021-05-28 11:14
为什么你的头像跟我老婆这么像?
点赞 回复 分享
发布于 2021-04-06 15:40
太妙了,是真的厉害
点赞 回复 分享
发布于 2021-04-04 10:53
妙啊
点赞 回复 分享
发布于 2021-03-25 16:06
那是真的牛批 那是真的牛批
点赞 回复 分享
发布于 2021-03-21 16:15
超时
点赞 回复 分享
发布于 2021-03-10 20:45
大佬厉害
点赞 回复 分享
发布于 2021-03-02 16:46
秒啊
点赞 回复 分享
发布于 2021-02-10 17:09
很棒的证明
点赞 回复 分享
发布于 2021-01-19 02:49
***,太牛了
点赞 回复 分享
发布于 2021-01-15 20:05
请问这样定义快慢指针的话不是还是利用了额外的空间吗
点赞 回复 分享
发布于 2021-01-06 11:52
niubi
点赞 回复 分享
发布于 2020-11-19 22:21
刚开始没懂为什么相遇后从头结点再来一个同速,再次相遇就是入口点,然后把给出的式子整理成 a = n*(b+c) - b之后瞬间就理解了 2333333 习惯性顺时针模拟行进路线了
点赞 回复 分享
发布于 2020-10-21 15:33
大佬大佬
点赞 回复 分享
发布于 2020-09-26 17:37
牛批牛批
点赞 回复 分享
发布于 2020-07-30 15:32

相关推荐

牛至超人:哈工大已经很棒了,不需要加括号了,然后咋没有实习经历呢?火速趁寒假整一段实习,导师不让就狠狠肘击
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
108
21
分享

创作者周榜

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