劍指offer第二版(Python3)--面試題23:鏈表中環的入口

第2章 面試需要的基礎知識

第3章 高質量的代碼

  面試題16:數值的整數次方

  面試題21:調整數組順序使奇數位於偶數前面

  面試題22:鏈表中倒數第k個結點

  面試題23 :鏈表中環的入口

  面試題24 :翻轉鏈表

第4章 解決面試題的思路

第5章 優化時間和空間效率

第6章 面試中的各項能力

第7章 兩個面試案例


題目描述
牛客網
  給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。

解題思路
在這裏插入圖片描述
AC = k
CB = n
CC = m 環周長

  快指針每次走兩步,慢指針每次走一步。
  B點相遇時,慢指針走了 k+n,快指針走了 k+n+mx,x表示在環中走了x圈。
則有
             2(k+n) = k+n+mx
得到
                k = mx-n
  從上式可以看出,若此時一個指針從B點出發,一個指針從A點出發,以相同的速度前進,則必在C點相遇。還不懂的話繼續看,若有k=mx,則一個指針從C出發,一個指針從A出發,以相同速度前景,則必在C相遇,這是顯然的,但是前面推出k=mx-n,所以我們可以讓那個從C點出發的指針先走n步,然後在一起出發,不就仍在C點相遇嗎。先走n步不就是到了B點嗎,相當於在B點出發咯。

實戰

class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        if not pHead:
            return None
        fast, slow = pHead, pHead
        while fast:
            if not fast.next or not fast.next.next:
                return None
            fast = fast.next.next
            slow = slow.next
            if fast == slow:
                break
        fast = pHead
        while fast:
            if fast == slow:
                return fast
            fast = fast.next
            slow = slow.next
        return None
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章