141. Linked List Cycle

這題從前校招的時(shí)候看面試寶典的時(shí)候就見到過(guò)。思想就是快慢指針衷恭。

  • Use two pointers, walker and runner.
  • walker moves step by step. runner moves two steps at time.
  • if the Linked List has a cycle walker and runner will meet at some point.
public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null) return false;
        ListNode walker = head ;
        ListNode runner = head ;
        while (runner.next !=null && runner.next.next != null){
            walker = walker.next ;
            runner = runner.next.next ;
            if(walker == runner) return true ; 
        }
        return false;
    }
}

時(shí)間O(n),空間O(1)杖狼。
這程序?qū)懫饋?lái)有個(gè)注意點(diǎn)披蕉,就是while語(yǔ)句的判斷,runner.next !=null && runner.next.next != null
這個(gè)條件是值得注意的伞访,首先它是遞進(jìn)的掂骏,先判斷runner.next再判斷runner.next.next;其次它只判斷runner不用判斷walker厚掷,因?yàn)閞unner永遠(yuǎn)走在前面弟灼。我一開始寫成walker.next !=null && runner.next.next != null這種是錯(cuò)的。

O(n)空間的方法

其實(shí)這道題的follow up說(shuō)冒黑,能不能用一個(gè)不需要空間的方法田绑?說(shuō)明除了快慢指針還有其他方法的。搜索了一下抡爹,發(fā)現(xiàn)O(n)空間的方法是:

遍歷鏈表掩驱,如果某個(gè)節(jié)點(diǎn)重復(fù)出現(xiàn),那就是有環(huán)冬竟。

另外欧穴,對(duì)于有環(huán)我還有一些問題,比如1->2->1->2->3這樣的單鏈表算不算有環(huán)泵殴?等等涮帘。

問了下師弟,師弟說(shuō)我蠢笑诅。2怎么能既指向1又指向3呢调缨?
這題在Java跟C里面有一些不一樣。
這個(gè)O(n)空間的方法的描述應(yīng)該是這樣的:

從鏈表頭開始遍歷整個(gè)鏈表吆你,并且記錄已經(jīng)遍歷過(guò)的結(jié)點(diǎn)地址弦叶,如果發(fā)現(xiàn)有正在遍歷的結(jié)點(diǎn)是已經(jīng)遍歷過(guò)的,則說(shuō)明是存在環(huán)的早处。但是這種方式就需要使用額外的空間來(lái)存放遍歷過(guò)的結(jié)點(diǎn)地址湾蔓。

看清楚了,存放的是結(jié)點(diǎn)地址砌梆,而不是節(jié)點(diǎn)默责。在Java里面贬循,雖然你可以生成同樣value、同樣next的結(jié)點(diǎn)桃序,但是無(wú)法檢查arraylist里面是否已經(jīng)有這個(gè)結(jié)點(diǎn)的「地址」杖虾,不,我想了下媒熊,下面這個(gè)代碼奇适,list.contains檢查的應(yīng)該就是head的地址!:

    public static boolean hasCycle(ListNode head) {
        if (head == null) return false;
        ArrayList<ListNode> list = new ArrayList<>();

        while (head != null) {
            if (list.contains(head)) {
                return true;
            }
            head = head.next;
            list.add(head);
        }
        return false;
    }

test case這樣寫就行了:

        ListNode n1 = new ListNode(1);
        ListNode n2 = new ListNode(2);

        n1.next = n2;
        n2.next = n1;

但是上面這個(gè)方法的復(fù)雜度在leetcode中TLE了芦鳍,不知是不是寫的有問題嚷往。復(fù)雜度應(yīng)該跟http://www.reibang.com/p/52f9a3346a88 這個(gè)里面的一樣的。

reference:
http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html
http://www.programcreek.com/wp-content/uploads/2012/12/linked-list-cycle-300x211.png

最后編輯于
?著作權(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)常有香客問我侥祭,道長(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ì)情侶失蹤啸胧,失蹤者是張志新(化名)和其女友劉穎赶站,沒想到半個(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ó)打工, 沒想到剛下飛機(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)容