• 牛客网_剑指offer题集——链表中环的入口结点(java实现)


    题目链接:

    https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&tqId=11208&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

    思路:

    为追及问题思路,使用快慢指针技术

    fast指针一次走两格

    slow指针一次走一格

    他们最终会有一次相遇(如果有环)

    思维逻辑:

    分为两种情况:第一种情况,fast和slow相遇时,fast指针比slow多走一圈,此时设slow指针走的步数为 x ,则 fast指针走了 2x ,设环中有n个节点,则2x - x = n,即x = n,也就是说此时slow指针的位置离环的入口的节点数等于链表头部距离环的入口的节点数(化成线性来说,就是两个等长线段有一段重合的部分,那么每段线段除掉重合的部分之后,长度也是相等的)

    第二种情况,fast和slow相遇时,fast指针比slow多走 r 圈(只要相遇,必定是多走了整数倍的圈),此时设slow的指针走的步数为x,则fast指针走了2x,设环中有n个节点,则2x - x = r * n,即x = r * n,和第一种情况一样,此时令fast指针指向头部,二者再次相遇时,所处于的结点就是环的入口(也是线性展开,只不过是多了循环而已)

    source code:

    package niuke;
    
    public class entryNodeOfLoop {
        public ListNode EntryNodeOfLoop(ListNode pHead) {
            ListNode fast = pHead;
            ListNode slow = pHead;
            if(pHead.next==null) return null;
            while(fast!=null){
                fast = fast.next.next;
                slow = slow.next;
                if(fast==slow) break;
            }
            if(fast==null) return null;
            fast = pHead;
            while(fast!=slow){
                fast = fast.next;
                slow = slow.next;
            }
    
            return fast;
        }
    }

    代码已经ac

    希望对大家有所帮助

    以上

  • 相关阅读:
    set命令_Linux
    AngularJS的date 过滤器
    JMeter环境介绍
    JMeter测试计划要素
    HTTP协议的压缩及URL Encode
    fiddler配置及使用教程
    Slenium常用方法
    Selenium八大定位
    CSS实现上下左右垂直居中
    SASS用法笔记
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/12607005.html
Copyright © 2020-2023  润新知