141 & 142. Linked List Cycle I/II

題干

141. Linked List Cycle
Given a linked list, determine if it has a cycle in it.
給予一個鏈表,返回這個鏈表是否存在循環(huán)。
142. Linked List Cycle II
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
Note: Do not modify the linked list.

給予一個鏈表,返回這個鏈表從哪個節(jié)點開始循環(huán)俐镐,如果鏈表中沒有循環(huán),則返回null彭雾。

解題思路

鏈表存在循環(huán)抄沮,指的是鏈表中某一個節(jié)點的next指針指向了過去的一個節(jié)點。
那么我們?nèi)绾蝸砼袛嘁粋€鏈表是否存在循環(huán)呢粥庄?
比較蠢的一個辦法丧失,判斷一個節(jié)點是否有出現(xiàn)過。
不能單獨靠val來判斷節(jié)點是否出現(xiàn)惜互,因為題干里沒有說所有的val都是unique的布讹。
但是每個節(jié)點的指針是獨特的,只要把遍歷過的指針存到一個數(shù)組中训堆,如果某個指針出現(xiàn)了第二次描验,那說明這個數(shù)組就是重復(fù)的。
但是吧坑鱼,這樣就太不優(yōu)雅了膘流,我們有沒有什么辦法不利用額外的空間來完成這個問題呢?
答案是有的:快慢指針鲁沥。
我們可以設(shè)計兩個游標(biāo)指針呼股,步長并不相同,如果兩者正好能指向同一個節(jié)點画恰,那么就說明鏈表中存在循環(huán)彭谁。

var hasCycle = function(head) {
    if(head==null){
        return false;
    }
    let slow = head;
    let fast = head;
    while(true){
        slow = slow.next;
        if(!fast||!fast.next){
            return false;
        }
        fast = fast.next.next;
        if(slow==fast){
            return true;
        }
    }
    return true;
};

這樣第一題就解決了,第二題還遠(yuǎn)嗎允扇?
在第一題中我們設(shè)慢指針步長為1缠局,快指針步長為2则奥,這個時候當(dāng)經(jīng)過多少步后,指針會指向同一個節(jié)點呢甩鳄?
做一個簡單的數(shù)學(xué)算式逞度,設(shè)鏈表不參加循環(huán)的長度為a,鏈表循環(huán)部分長度為b妙啃,步數(shù)為x档泽。
那么可以推得:x+b = 2x
經(jīng)過的步數(shù)就等于慢指針走過的步數(shù),這里我們可以推出循環(huán)部分的鏈表的長度揖赴,知道了這個長度以后馆匿,我們可以再設(shè)計一對快慢指針,這次兩個指針步長相同燥滑,但是快指針會先走出b步渐北,這樣當(dāng)快指針走到鏈表末尾時,慢指針正好指向了非循環(huán)部分的最后一個節(jié)點铭拧。而兩個指針各再向前一步赃蛛,得到的則是循環(huán)開始的節(jié)點。
而在剛才的程序中搀菩,慢指針正好是那個已經(jīng)走出了b步的指針呕臂,我們只需要將快指針指向頭節(jié)點,然后循環(huán)步長為1即可肪跋。
而對于不存在循環(huán)的鏈表來說歧蒋,將上題中的return false的部分改為return null即可。

var detectCycle = function(head) {
    if(head==null){
        return false;
    }
    let slow = head;
    let fast = head;
    while(slow!=fast){
        slow = slow.next;
        if(!fast||!fast.next){
            return null;
        }
        fast = fast.next.next;
    }
    fast = head;
    while(fast!=slow){
        fast = fast.next;
        slow = slow.next;
    }
    return slow;
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末州既,一起剝皮案震驚了整個濱河市谜洽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吴叶,老刑警劉巖阐虚,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚌卤,居然都是意外死亡敌呈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門造寝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磕洪,“玉大人,你說我怎么就攤上這事诫龙∥鱿裕” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵签赃,是天一觀的道長谷异。 經(jīng)常有香客問我分尸,道長,這世上最難降的妖魔是什么歹嘹? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任箩绍,我火速辦了婚禮,結(jié)果婚禮上尺上,老公的妹妹穿的比我還像新娘材蛛。我一直安慰自己,他們只是感情好怎抛,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布卑吭。 她就那樣靜靜地躺著,像睡著了一般马绝。 火紅的嫁衣襯著肌膚如雪豆赏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天富稻,我揣著相機與錄音掷邦,去河邊找鬼。 笑死椭赋,一個胖子當(dāng)著我的面吹牛抚岗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纹份,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼苟跪,長吁一口氣:“原來是場噩夢啊……” “哼廷痘!你這毒婦竟也來了蔓涧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤笋额,失蹤者是張志新(化名)和其女友劉穎元暴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兄猩,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡茉盏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枢冤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸠姨。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淹真,靈堂內(nèi)的尸體忽然破棺而出讶迁,到底是詐尸還是另有隱情,我是刑警寧澤核蘸,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布巍糯,位于F島的核電站啸驯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祟峦。R本人自食惡果不足惜罚斗,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宅楞。 院中可真熱鬧针姿,春花似錦、人聲如沸咱筛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迅箩。三九已至溉愁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饲趋,已是汗流浹背拐揭。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奕塑,地道東北人堂污。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像龄砰,于是被迫代替她去往敵國和親盟猖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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