劍指offer--鏈表中環的入口節點(PHP)


題目:一個鏈表中包含環,請找出該鏈表的環的入口結點。



剛拿到這個題目時,完全是懵的狀態。本來這段時間都在做關於鏈表的題目,但是,真的每個題目都不一樣,完全是另外的跟之前的題目大相徑庭的。但是,在解題過程中,前面所學到的東西還是有用的。比如:&& 等。

思路:利用鏈表中有環,如果遍歷鏈表的時候一個指針跑得快,另一個指針跑得慢,總會出現快的追上慢的。當追上的時候,慢的指針所走(從首節點開始)的路徑長度一定是出現環的節點的數目。而快的指針所走的路徑長度比慢的指針的路徑長度一個環的長度。

求入口節點:當第一次慢快指針相遇時,讓第三個指針從頭開始指向頭結點。每次向前走一步。當第三個指針和第第一個指針相遇時的節點即為,環的入口節點。、

代碼為:

function EntryNodeOfLoop($pHead)
{
// write code here
if($pHead == null)return $pHead;
$p1 = $pHead;
$p2 = $pHead;
while($p2 && $p1){
$p1 = $p1->next;
$p2 = $p2->next->next;
if($p1 == $p2){
$p3 = $pHead;
while($p1 && $p3){
if($p1 == $p3){
return $p3;
}
//這里特別說明當出現,該鏈表即為環鏈表時(第一個節點即為入口節點)
當第一次相遇的地方就是第一節點的地方。
 $p1 = $p1->next;
$p3 = $p3->next;
if($p1 == $p3){
return $p3;
}
}
}
}
}

2:該題還有其他解法,到時候再更新。

幫助理解:點擊打開鏈接


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com