zoukankan      html  css  js  c++  java
  • LeetCode141-环形链表(水题)

    因为链表最后一个元素都是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;
    
            }
        }

  • 相关阅读:
    redis集群的测试
    nginx+tomcat集群
    linux 端口占用查看 netstat -tunpl | grep 6379
    Openfire 的安装和配置
    openfire自定义发送消息
    druid+spring配置
    java Servlet Filter 拦截Ajax请求,统一处理session超时的问题
    Tomcat8安装, 安全配置与性能优化
    ssh 免密码登录【用】
    SSH-KeyGen 的用法
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9457131.html
Copyright © 2011-2022 走看看