码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode141-环形链表(水题)

时间:2018-08-10 23:13:49      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:pre   style   ima   .com   不同的   alt   false   next   为什么   

因为链表最后一个元素都是null,只有能到达null的,就是无环。

 

有环链表,只要两个不同的指针,一个走一步,一个走两步,绝对能相遇。

证明一下为什么可以相遇。

假设A的速度是1次一步,B的速度是2步,链表有环,且长度是N。

假设在X步之后相遇了,间隔是D圈

那么就是X/N+DN = 2X/N

可以求得相遇的步数为X=DN*N。

 

其实给定一个假设更好理解。

如果能求出在某个时刻他们位置一样,那肯定能证明能相遇,用跑操场做类比。

第一次相遇,肯定是他们之间差了一圈。因为刚好一圈的距离才会第一次相遇,好几圈的距离是相遇好几次了。

为了这一圈的距离,可能他们已经跑了很多圈了。但是第一次相遇,距离差肯定是一圈。

假如A的速度是S/s,B是2S/s,跑了T秒,操场长N

ST+N=2ST

可以求得T=N/S,这个N和S都是常量,T肯定是存在的。

所以说,只要存在速度差,肯定会相遇。

 

接下来就是写代码了

最直接的写法,就是把可能的地方都判断,不然就空指针了

public boolean hasCycle(ListNode head) {
        
        if(head==null)
            return false;
        
        //环形跑道,有速度差,肯定会相遇
        ListNode p1 = head;
        ListNode p2 = head;

        while(true){

            //p1走一步
            p1=p1.next;

            //空了肯定不是环
            if(p1==null)
                return false;

            //next的next相当于走了两步
            p2=p2.next;
            if(p2.next==null)
                return false;
            p2=p2.next;
            if(p2.next==null)
                return false;

            //相遇就是环
            if(p1==p2)
                return true;

        }
    }

 

技术分享图片

 

LeetCode141-环形链表(水题)

标签:pre   style   ima   .com   不同的   alt   false   next   为什么   

原文地址:https://www.cnblogs.com/weizhibin1996/p/9457131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!