鏈表尋找環(huán)的入口

給一個(gè)鏈表惭缰,若其中包含環(huán),請(qǐng)找出該鏈表的環(huán)的入口結(jié)點(diǎn)笼才,否則漱受,輸出null。

分析:如何判斷有環(huán)骡送?如何找到環(huán)的入口節(jié)點(diǎn)昂羡?

首先判斷是否有環(huán)
1.窮舉法。(每個(gè)節(jié)點(diǎn)都放到一個(gè)哈希表數(shù)組)這里我們使用容器set摔踱,如果遍歷到某個(gè)鏈表結(jié)點(diǎn)已經(jīng)在set中虐先,那么該點(diǎn)即為環(huán)的入口結(jié)點(diǎn);
2.快慢指針?lè)ā?br> (1)快指針一次走兩步派敷,慢指針一次走一步蛹批。如果有環(huán)的話,那么快指針一定會(huì)追上快指針膀息,就像一個(gè)環(huán)形的跑道中般眉,跑的快的運(yùn)動(dòng)員一定會(huì)追上跑的慢的運(yùn)動(dòng)員。
(2)快指針先走一步潜支,然后和慢指針一起從從節(jié)點(diǎn)開始走甸赃。如果有環(huán)的話,那么快指針一定會(huì)追上快指針冗酿,就像一個(gè)環(huán)形的跑道中埠对,跑的快的運(yùn)動(dòng)員一定會(huì)追上跑的慢的運(yùn)動(dòng)員。

如何找到環(huán)的入口節(jié)點(diǎn)
參考一種思路裁替。一個(gè)數(shù)學(xué)問(wèn)題项玛。


image.png

如上圖,

首先我們?cè)O(shè):

鏈表頭到環(huán)入口長(zhǎng)度為--a

環(huán)入口到相遇點(diǎn)長(zhǎng)度為--b

相遇點(diǎn)到環(huán)入口長(zhǎng)度為--c

先說(shuō)說(shuō)快慢指針?lè)ǖ模?)弱判。

如果鏈表存在環(huán)襟沮,那么計(jì)算出環(huán)的長(zhǎng)度n,快指針先走n步昌腰,然后快指針和慢指針一塊走开伏,當(dāng)兩者相遇時(shí),即為環(huán)的入口處遭商;
證明如下:
設(shè):

鏈表頭到環(huán)入口長(zhǎng)度為--a

鏈表總長(zhǎng)度--k

環(huán)的長(zhǎng)度--n

則:a+n=k,當(dāng)快節(jié)點(diǎn)先走了一個(gè)環(huán)的長(zhǎng)度n時(shí)固灵,再走一個(gè)a的路程就到達(dá)鏈表的終點(diǎn),也就是環(huán)的入口劫流。所以此時(shí)讓一個(gè)指針從頭節(jié)點(diǎn)開始走巫玻,當(dāng)兩個(gè)指針相遇時(shí)丛忆,即為環(huán)的入口節(jié)點(diǎn)。

快慢指針?lè)ǖ模?)

兩個(gè)結(jié)論:

1仍秤、設(shè)置快慢指針熄诡,假如有環(huán),他們最后一定相遇徒扶。

2粮彤、兩個(gè)指針?lè)謩e從鏈表頭和相遇點(diǎn)繼續(xù)出發(fā)根穷,每次走一步姜骡,最后一定相遇與環(huán)入口。

證明如下

證明1:設(shè)置快慢指針fast和low屿良,fast每次走兩步圈澈,low每次走一步。假如有環(huán)尘惧,兩者一定會(huì)相遇(因?yàn)閘ow一旦進(jìn)環(huán)康栈,可看作fast在后面追趕low的過(guò)程寂殉,每次兩者都接近一步宣增,最后一定能追上)勉盅。

證明2:

快指針路程=a+(b+c)k+b 坎背,k>=1 其中b+c為環(huán)的長(zhǎng)度柬焕,k為繞環(huán)的圈數(shù)(k>=1,即最少一圈欣硼,不能是0圈骑冗,不然和慢指針走的一樣長(zhǎng)秉宿,矛盾)疙剑。

慢指針路程=a+b

快指針走的路程是慢指針的兩倍氯迂,所以:

(a+b)*2=a+(b+c)k+b

化簡(jiǎn)可得:

a=(k-1)(b+c)+c 這個(gè)式子的意思是: 鏈表頭到環(huán)入口的距離=相遇點(diǎn)到環(huán)入口的距離+(k-1)圈環(huán)長(zhǎng)度。其中k>=1,所以k-1>=0圈言缤。所以兩個(gè)指針?lè)謩e從鏈表頭和相遇點(diǎn)出發(fā)嚼蚀,最后一定相遇于環(huán)入口。

通過(guò)的測(cè)試用例


/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }

*/

public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode fast=pHead;
        ListNode slow=pHead;
         ListNode meet=null;
        while(fast.next!=null||fast==null){
            fast=fast.next.next;
            slow=slow.next;
       
            if(slow==fast){
                meet=fast;
                fast=pHead;
                while(fast!=meet){   //判斷節(jié)點(diǎn)相遇
                    fast=fast.next;
                    meet=meet.next;
                
                }
                
                    return fast;
                }
            
            }
            
        if(fast.next==null||fast==null){
            return null;
            
             }
       return null;
        }
        
    }

ps:題外話:昨天去孩子王筆試+面試 這是面試官問(wèn)我的一道題目:如何在一個(gè)單鏈表判斷是否有環(huán)管挟,很遺憾轿曙,在面試官提示快慢指針的情況下還是沒(méi)有想清楚,回答錯(cuò)誤僻孝。希望吸取教訓(xùn)导帝,好好補(bǔ)基礎(chǔ)+多想想。2019/5/21

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皮璧,一起剝皮案震驚了整個(gè)濱河市舟扎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悴务,老刑警劉巖睹限,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件譬猫,死亡現(xiàn)場(chǎng)離奇詭異羡疗,居然都是意外死亡染服,警方通過(guò)查閱死者的電腦和手機(jī)叨恨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門痒钝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚕甥,你說(shuō)我怎么就攤上這事栋荸。” “怎么了爱沟?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵匆背,是天一觀的道長(zhǎng)靠汁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蝶怔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任澳叉,我火速辦了婚禮沐悦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓶殃。我一直安慰自己副签,他們只是感情好基矮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布家浇。 她就那樣靜靜地躺著碴裙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舔株。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天芦昔,我揣著相機(jī)與錄音,去河邊找鬼珠十。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晒杈,可吹牛的內(nèi)容都是我干的孔厉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼粪般,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼亩歹!你這毒婦竟也來(lái)了凡橱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤顾稀,失蹤者是張志新(化名)和其女友劉穎坝撑,沒(méi)想到半個(gè)月后氮块,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诡宗,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塔沃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了螃概。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸽疾。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冒窍,靈堂內(nèi)的尸體忽然破棺而出豺鼻,到底是詐尸還是另有隱情,我是刑警寧澤谬莹,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布桩了,位于F島的核電站,受9級(jí)特大地震影響井誉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慢显,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一荚藻、第九天 我趴在偏房一處隱蔽的房頂上張望洁段。 院中可真熱鬧,春花似錦疾呻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至单芜,卻和暖如春犁柜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扒腕。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工袜匿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稚疹,地道東北人祭务。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像义锥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赂鲤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 8,977評(píng)論 0 13
  • 鏈表問(wèn)題是面試過(guò)程中經(jīng)常被問(wèn)到的一部分,很考查編程功底泡孩。最近刷了 LeetCode 上鏈表部分的面試題寺谤,我總結(jié)了一...
    JohnnyShieh閱讀 4,954評(píng)論 0 9
  • (一)LeetCode206.反轉(zhuǎn)鏈表 題目描述: 反轉(zhuǎn)一個(gè)單鏈表吮播。 代碼實(shí)現(xiàn) (二)LeetCode160. 相...
    Jarily閱讀 1,404評(píng)論 0 5
  • 本文首發(fā)于我的個(gè)人博客:尾尾部落 鏈表是面試過(guò)程中經(jīng)常被問(wèn)到的获列,這里把劍指offer 和 LeetCode 中的相...
    繁著閱讀 2,134評(píng)論 1 15
  • 轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/c65d9d753c31 在上一篇博客《數(shù)據(jù)結(jié)構(gòu)...
    Alent閱讀 3,500評(píng)論 4 74