zoukankan      html  css  js  c++  java
  • 牛客网_剑指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

    希望对大家有所帮助

    以上

  • 相关阅读:
    loj10008家庭作业
    loj10006数列分段
    loj10005数列极差
    loj10004智力大冲浪
    codevs 1996 矿场搭建
    11.3 上午考试
    11.2 晚上考试
    11.2 下午考试
    11.2 上午考试
    11.1 下午考试
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/12607005.html
Copyright © 2011-2022 走看看