重磅乾貨,第一時間送達java
鏈表中環的入口結點程序員
給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,不然,輸出null。面試
先看一張圖,首先A是起點,C是環的入口點,B是指針的相遇點正則表達式
既然要相遇,那必然是兩個指針的相遇。那他的快慢程度如何肯定?
咱們假設快指針fast一次走2步,慢指針slow一次走1步,每次拉開的差距就是1步,因爲咱們知道這個鏈表是個環,那麼這樣快指針fast必定能夠遇上slow(至關因而套圈),fast恰好比slow多走了一圈環的長度。。算法
固然以上只是思路的第一步,第二步相遇以後你要怎麼作?相遇的地點咱們能計算出來嗎?
假設id=a是入環處,c是入環處a的上一節點。
如今咱們求出了相遇點是在id=c-a+1的位置,成功了一大半了。(感受用電腦畫圖比較費時間你們將就看)
如今id=c-a處離環的入口處距離爲a,此時發現與咱們的鏈表平鋪長度c無關!數組
最後一步:調整指針,將一個指針放在id=c-a+1處,一個指針放在id=0處,每次移動一個,相遇便是入口處!微信
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def EntryNodeOfLoop(self, pHead): # write code here slow,fast=pHead,pHead while fast and fast.next: slow=slow.next fast=fast.next.next if slow==fast: slow=pHead while slow!=fast: slow=slow.next fast=fast.next return slow
import java.util.*;數據結構
public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead==null) return null; ListNode pNode=pHead; HashSet<ListNode> pSet = new HashSet<ListNode>(); while(pNode!=null){ if(!pSet.add(pNode)) return pNode; pNode=pNode.next; } return null; } }
注:面試季來了,不論是做爲面試者仍是之後做爲面試官,瞭解算法這門程序員之間的溝通方式都是很是必要的。找過工做的朋友應該都據說過《劍指offer》,雖然書中只有六十多道題目,可是道道都是經典。機器學習
若是是單純的面試需求,劍指offer的優先級確定是在Leetcode以前,總的說它有三個優勢:ide
它的缺點是:
劍指offer刷題交流羣
掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆),只有備註正確才能夠加羣噢。
▲長按加羣