牛客网_剑指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

希望对大家有所帮助

以上

posted @ 2020-03-31 18:05  醉生梦死_0423  阅读(105)  评论(0编辑  收藏  举报