摘要:為什么這么做就可以保證在入環(huán)節(jié)點相遇證明一下如圖,設(shè)整個鏈表長度為,環(huán)長度為,且距離具有方向性,例如是點到點的距離,是點到點的距離,。代碼實現(xiàn)有環(huán),重新回到鏈表頭和重新相遇時,相遇節(jié)點就是入環(huán)節(jié)點
題目描述
判斷一個單鏈表是否有環(huán),有環(huán)則返回入環(huán)節(jié)點,否則返回null
1->2->3->4->5->6 ↑ ↓ 8<-7
例如上面這個鏈表就有環(huán),入環(huán)節(jié)點是5
判斷鏈表有環(huán)通常判斷鏈表是否有環(huán),會采用快慢指針的方法,其實道理很簡單,就像兩個人賽跑且一個人跑得快一個人跑得慢。如果賽道是直的,那么快人跑到終點時慢人還未到;如果賽道是環(huán)形,則快人和慢人總會相遇。
代碼實現(xiàn)
function ListNode(x){ this.val = x; this.next = null; } function EntryNodeOfLoop(pHead){ if(pHead === null) return null; // 快慢指針從鏈表的頭部開始 var fast = pHead; var slow = pHead; while(fast.next !==null && fast.next.next !== null) { // 快指針每次走兩步;慢指針每次走一步 slow = slow.next; fast = fast.next.next; // 快慢指針相遇時,跳出while循環(huán) if(slow === fast) break; } // 快指針已經(jīng)到了鏈表尾部了還沒和慢指針相遇,說明沒有環(huán) if(fast === null || fast.next === null) return null; // 后續(xù)會處理有環(huán)的情況... }找到入環(huán)節(jié)點
常見的方法是:在確定鏈表有環(huán)之后,慢指針重新指向鏈表頭,快指針留在相遇處;然后快慢指針再以每次移動1個節(jié)點的速度前進,最終他們在入環(huán)節(jié)點相遇。
為什么這么做就可以保證在入環(huán)節(jié)點相遇?證明一下:
如圖,設(shè)整個鏈表長度為L,環(huán)長度為R,且距離具有方向性,例如CB是C點到B點的距離,BC是B點到C點的距離,CB!=BC。當(dāng)證明有環(huán)時,fast和slow都順時針到了B點,則此時:
slow走的距離:AC+CB
fast走的距離:AC+k*R+CB(k=0,1,2...)
由于fast每次走2個節(jié)點,slow每次走1個節(jié)點,所以:
2(AC+CB) = AC+k*R+CB
AC+CB = k*R
AC+CB = (k-1)*R+R
AC = (k-1)*R+R-CB
AC = (k-1)*R+BC
從最終的表達(dá)式可以看出來,AC的距離等于繞環(huán)若干圈后再加上BC的距離,也就是說慢指針從A點出發(fā)以速度1前進、快指針從B點出發(fā)以速度1前進,則慢指針到C點時,快指針也必然到了。
代碼實現(xiàn):
function ListNode(x){ this.val = x; this.next = null; } function EntryNodeOfLoop(pHead){ if(pHead === null) return null; var fast = pHead; var slow = pHead; while(fast.next !==null && fast.next.next !== null) { slow = slow.next; fast = fast.next.next; if(slow === fast) break; } if(fast === null || fast.next === null) return null; // 有環(huán),slow重新回到鏈表頭 slow = pHead; // slow和fast重新相遇時,相遇節(jié)點就是入環(huán)節(jié)點 while(slow !== fast) { slow = slow.next; fast = fast.next; } return slow; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95503.html
摘要:空間復(fù)雜度雙指針,循環(huán)數(shù)組,較小的那個先向內(nèi)移動如果高的指針先移動,那肯定不如當(dāng)前的面積大計算面積更新最大面積相交鏈表方法哈希表思路將鏈表存入中,第一個相同的節(jié)點就是重合的節(jié)點復(fù)雜度時間復(fù)雜度,分別是兩個鏈表的長度。 大廠算法面試之leetcode精講7.雙指針視頻教程(高效學(xué)習(xí)):點擊學(xué)習(xí)目錄:1.開篇介紹2...
摘要:既然說到地址空間了就順帶說一下上面環(huán)形鏈表這道題的另一種很的解法吧。介紹完常規(guī)操作鏈表的一些基本知識點后,現(xiàn)在回到快慢指針。 ??前幾天第一次在 Segmentfault 發(fā)文—JavaScript:十大排序的算法思路和代碼實現(xiàn),發(fā)現(xiàn)大家似乎挺喜歡算法的,所以今天再分享一篇前兩個星期寫的 Leetcode 刷題總結(jié),希望對大家能有所幫助。 ??本文首發(fā)于我的blog 前言 ??今天終于...
摘要:還是鏈表算法題目描述給出兩個無環(huán)單鏈表判斷和是否相交。所以可以得出另外一種解法,先遍歷鏈表,記住尾節(jié)點,然后遍歷鏈表,比較兩個鏈表的尾節(jié)點,如果相同則相交,不同則不相交。想法還是奇妙的。算法寫起來不難,難的是想到這個。 還是鏈表算法 題目描述:給出兩個無環(huán)單鏈表A: a1 → a2 ↘ c1 → c2 → c3 → ...
摘要:由于要比移動的快,如果有環(huán),一定會先進入環(huán),而后進入環(huán)。現(xiàn)在問題就簡單了,由于移動的距離永遠(yuǎn)是的一般,因此當(dāng)遍歷玩整個環(huán)長度個節(jié)點的時候正好遍歷了個節(jié)點,也就是說,此時正好指向距離最遠(yuǎn)的點。 首先,關(guān)于單鏈表中的環(huán),一般涉及到以下問題: 1.給一個單鏈表,判斷其中是否有環(huán)的存在; 2.如果存在環(huán),找出環(huán)的入口點; 3.如果存在環(huán),求出環(huán)上節(jié)點的個數(shù); 4.如果存在環(huán),求出鏈表的長度; ...
閱讀 1216·2021-11-22 12:05
閱讀 1343·2021-09-29 09:35
閱讀 640·2019-08-30 15:55
閱讀 3133·2019-08-30 14:12
閱讀 960·2019-08-30 14:11
閱讀 2881·2019-08-30 13:10
閱讀 2406·2019-08-29 16:33
閱讀 3335·2019-08-29 11:02