Leetcode-142Linked List Cycle II

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.

Follow up:
Can you solve it without using extra space?

題解:

本題要求的是鏈表中存在的環(huán)的入口節(jié)點(diǎn)向叉,如果不存在環(huán)吏颖,則返回NULL呢岗;
兩種方法:
第一種方法很簡(jiǎn)單济蝉,使用集合set茵汰,每次在set中查找節(jié)點(diǎn)是否已存在瘾英,如果沒(méi)有浩村,將鏈表中節(jié)點(diǎn)存入set中露戒,如果存在描验,則說(shuō)明該位置為環(huán)的起始節(jié)點(diǎn)白嘁;
下面我們?cè)敿?xì)介紹下第二種方法,快慢指針膘流;


image.png

如圖:我們用fast表示快指針絮缅,每次移動(dòng)兩步;slow表示慢指針呼股,每次移動(dòng)一步耕魄;圖中f1,s1分別對(duì)應(yīng)著第一次移動(dòng)是快慢指針移動(dòng)后所指向的位置彭谁;可以看到吸奴,當(dāng)快慢指針移動(dòng)到第五步(f5,s5)時(shí)缠局,他們相遇了奄抽;下面我們來(lái)分析下快慢指針相遇前經(jīng)過(guò)的節(jié)點(diǎn):
slow:節(jié)點(diǎn)1->2->3->4->5->6
fast:節(jié)點(diǎn)1->2->3->4->5->6->7->3->4->5->6
由于slow每次移動(dòng)一步,fast每次移動(dòng)兩步甩鳄,所以不難得出:
fast = 2*slow
所以得到:
(1->2->3->4->5->)6, 1->2->3(->4->5->6) =
(1->2->3->4->5->)6->7->3(->4->5->6)
刪除帶括號(hào)的重復(fù)部分逞度,最終得到:
1->2->3 = 6->7->3
進(jìn)行到這里,我們可以得出介樣一個(gè)結(jié)論妙啃,辣就是從頭結(jié)點(diǎn)(1)到環(huán)的起始節(jié)點(diǎn)(3)的距離等同于從快慢指針相遇的結(jié)點(diǎn)(6)到環(huán)的起始節(jié)點(diǎn)(3)的距離5翟蟆!
最后給出快慢指針的C++實(shí)現(xiàn)以及set的Python實(shí)現(xiàn):

My Solution1(C/C++完整實(shí)現(xiàn)):

#include <cstdio>
#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x): val(x), next(NULL) {}
};

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *slow = head;
        ListNode *fast = head;
        ListNode *meet = NULL;
        while(fast) {
            slow = slow->next;
            fast = fast->next;
            if(!fast) {
                return NULL;
            }
            fast = fast->next;
            if(fast == slow) {
                meet = fast;
                break;
            }
        }
        while(meet) {
            if(head == meet) {
                return head;
            }
            meet = meet->next;
            head = head->next;
        }
        return NULL;
    }
};

int main() {
    ListNode a(1);
    ListNode b(2);
    ListNode c(3);
    ListNode d(4);
    ListNode e(5);
    ListNode f(6);
    ListNode g(7);
    a.next = &b;
    b.next = &c;
    c.next = &d;
    d.next = &e;
    e.next = &f;
    f.next = &g;
    g.next = &c;
    Solution s;
    ListNode *result = s.detectCycle(&a);
    printf("%d\n", result->val);
    return 0;
}

結(jié)果:

3

Process returned 0 (0x0)   execution time : 0.023 s
Press any key to continue.

My Solution2(Python):

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        s = set('')
        while head:
            if head not in s:
                s.add(head)
            else:
                return head
            head = head.next
        return None
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揖赴,一起剝皮案震驚了整個(gè)濱河市馆匿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燥滑,老刑警劉巖渐北,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗅剖,死亡現(xiàn)場(chǎng)離奇詭異风题,居然都是意外死亡淆游,警方通過(guò)查閱死者的電腦和手機(jī)港粱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呕臂,“玉大人破托,你說(shuō)我怎么就攤上這事∑缃” “怎么了土砂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谜洽。 經(jīng)常有香客問(wèn)我萝映,道長(zhǎng),這世上最難降的妖魔是什么阐虚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任序臂,我火速辦了婚禮,結(jié)果婚禮上敌呈,老公的妹妹穿的比我還像新娘贸宏。我一直安慰自己造寝,他們只是感情好磕洪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著诫龙,像睡著了一般析显。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上签赃,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天谷异,我揣著相機(jī)與錄音,去河邊找鬼锦聊。 笑死歹嘹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孔庭。 我是一名探鬼主播尺上,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼圆到!你這毒婦竟也來(lái)了怎抛?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芽淡,失蹤者是張志新(化名)和其女友劉穎马绝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挣菲,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡富稻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年掷邦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唉窃。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耙饰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纹份,到底是詐尸還是另有隱情苟跪,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布蔓涧,位于F島的核電站件已,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏元暴。R本人自食惡果不足惜篷扩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茉盏。 院中可真熱鬧鉴未,春花似錦、人聲如沸鸠姨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讶迁。三九已至连茧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巍糯,已是汗流浹背啸驯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祟峦,地道東北人罚斗。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宅楞,于是被迫代替她去往敵國(guó)和親针姿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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