這些演算法問題網上有很多講解的,因為要設計到一些數學的邏輯推算問題,所以看了很多剛開始真是沒動整個推演過程是什麼樣子的,活生生從早
上6點搞到下午有時間就想一下,沒想上了趟廁所回來就知道怎麼回事了,記錄一下,以防再次忘記。
另乙個要掌握的理由就是這都是特別經典的 演算法題,雖然不用但是面試還是會常常被問到的
這個問題我還是用快慢針吧,效率上是最高的時間複雜度為o(n),
public
static
void
main
(string[
] args)
//快慢針法檢測鍊錶是否有環
public
static
boolean
check
(node node)
}return
false;}
public
static
class
node
int data;
node next;
@override
public string tostring()
';}}
日誌2----33
----54
----75
----46
----
6組中快慢針相遇,證明了有環的存在
我就是在這裡坑了很久出不來,看別人的**的時候就覺得很簡單,但是自己那張紙 拿著筆 手寫你試試,如何推演的就比較難了,畢竟涉及到了數學問題。
快慢針法:
假設 :慢針速度為v 快針為2v 快慢針在b點相遇,環的起始點為a 環的周長為 r ,b到 a的距離為c
則我們得到以下公式:
1.兩者到相遇走的路程為s1=a+b ; s2=a+b+n*r s2=2*s1
2.由上得到 2(a+b)=a+b+n*r 則 a+b =n*r a=n*r-b
3.因為環長為r b+c=r 則 a=n*r-(r-c)
4.最終得到 a=(n-1)r+c
從最終的結論中我們可以看出,第一圈的時候a=c ,那我們想要找到起始點則讓快針回到head一次走一步,慢針從相遇點一次走一步,相遇時
就是環的起始點了
public
static node getnode
(node node)
} node result = null;
//如果有環,則讓快針回到起點,因為兩者到環起點的距離相等,所以兩者同時每次移動,相遇的時候就是環的起點
if(iscircle)}}
return result;
}
鍊錶系列 鍊錶環相關問題
設定兩個節點 slow fast,若存在環,分別從鍊錶的頭節點出發,乙個每次向後移動一步,另乙個移動兩步,兩個指標移動速度不一樣,如果存在環,那麼兩個指標一定會在環裡相遇。public boolean hascircle node head node slow head node fast head...
鍊錶中與環相關的問題
141.linked list cycle given a linked list,determine if it has a cycle in it.follow up can you solve it without using extra space?subscribe to see whic...
鍊錶環問題
給定乙個鍊錶,判斷該鍊錶中是否有環?如果有的話,環的長度是多少?環的入口是哪個節點?使用快慢指標策略,兩個指標都從頭指標出發,快指標每次走兩步,慢指標每次走一步。1.判斷鍊錶是否有環?如果快慢節點相遇,那麼鍊錶有環。2.如果有環,環的長度是多少?快慢指標相遇後,固定其中乙個指標 如快指標 不動,另乙...