鍊錶 鍊錶中環的入口結點

2021-09-25 18:47:11 字數 1726 閱讀 9231

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null;

鍊錶中某些結點構成了乙個環,找打環的入口結點

head->a1->a2->a3...

使用雙層迴圈,例如對於結點a1,遍歷整個鍊錶判斷是否有a1 = head->next;(head = head->next);a2,a3,......an;依次

測試報錯,沒通過

/*

struct listnode

};*/

class solution

else

}temp = temp->next;

}if(temp == null)}};

另外,參考:卻顧所來徑

step1、找兩者相遇點

設定兩個指標,快指標fast每次走兩個結點的距離,慢指標slow每次走乙個結點的距離;

鍊錶中沒有環,直到走完整個鍊錶,slow不可能追上fast;

鍊錶中有環,fast先進環,繞環走,slow後進環,相相當於fast在追slow,兩者一定會相遇

step2:

兩個指標,slow從表頭開始走,fast從相遇點開始走(兩者速度一樣,每次走乙個結點),最後一定相遇與環入口

表頭到環入口的距離為a;環入口到相遇點的距離為b;相遇點到環入口距離為c;

實現過程:

1、當fast、slow兩者相遇時,快指標的路程是慢指標路程的兩倍

(因為兩者走是同步的,只不過fast速度是slow的兩倍,不管相不相遇,同一時刻,fast走的路程都是slow的兩倍)

fast走的路程:a+(b+c)*k+b

slow走的路程:a+b

(a+b)*2 = a+(b+c)*k+b  --》a = (k-1)*(b+c)+c         (1)

即,煉表頭到環入口的距離 = 相遇點到環入口距離 + 環長度*(k-1)

2、記錄相遇結點之後,讓fast從相遇結點開始走,slow從表頭開始走兩者一定在環入口相遇

為什麼會在環入口相遇?根據公式(1)計算得到

class solution 

while(fast && slow)else

}//fast從相遇點出發,slow從表頭出發

slow = phead;

while(fast != slow)

return fast;}};

測試通過**

class solution

} //此時fast 及fast->next為空,返回null

if(!fast || !fast->next)

return null;

// 難點:slow從表頭出發,fast從相遇點出發,為什麼當fast和slow相遇一定是在環入口

// 本身資料結構不難,難的是,將問題抽象為數學模型

slow = phead;//low從煉表頭出發

while(fast != slow)

return slow;

}};

鍊錶 鍊錶中環的入口結點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。知識點回顧 快慢指標 思路 使用快慢指標 假設有p,q兩指標,p每步跨乙個結點,q每步跨兩個結點。那麼經過k步之後q比p多走過的結點數為k。如果鍊錶中沒有環,那麼q永遠在p的前面,兩指標不會相遇。如果鍊錶有環,且環中結點個數為...

鍊錶中環的入口結點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。class listnode public class solution return p1 return null 分析 假設鍊錶的起始點到環的入口點節點數為k,環的的節點數為x,讓p2的速度是p1的兩倍,p1和p2相遇在環的第y各節點,可以得到如下等...

鍊錶中環的入口結點

題目要求 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 分析 1 一種比較偷懶的方法就是遍歷鍊錶,並直接利用hashmap來儲存已經遍歷過的結點。一旦發現已經儲存過的結點,那麼該結點就是環的入口結點。2 參考自 我簡單畫了乙個圖 上傳之後一直是橫過來的。不知道為什麼轉不正 設定兩個指標p1和p2,乙...