第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