鍊錶交點問題也屬公司青睞的專題之一,一般依靠雙指標來解決,主要分為鍊錶判環和鍊錶相交兩大專題。
判斷鍊錶是否有環,若有環,則返回環入口節點。
這題就是典型的快慢指標問題,**很簡單,但具體理論證明卻十分值得研究。
首先先說解法, 分兩部分,判環和尋找入口:
判環部分,設定兩個指標(快指標fa一次走兩個節點,慢指標sl一次走乙個節點),若快指標走到了鍊錶尾即空節點則說明鍊錶無環,否則在環中快慢指標必能相遇。
尋找入口部分,慢指標不變,快指標移至煉表頭,並也開始一步一節點的行走,雙指標同時移動,相遇處即為環入口
判環部分不難理解,如操場跑圈一般,快者定能追上慢著。然而尋找入口部分就顯得十分玄學了,下面我們開始理論證明。
假設鍊錶由長度為
那麼此時,快指標走了
不難發現,若想找到環入口,從鏈頭開始,指標必須前進
恰巧,快指標回歸鏈頭一步一點走
/*
author owen_q
*//**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
if(fa == null)
return fa;
fa = head;
while(fa != sl)
return fa;}};
經典鍊錶相交問題,倆無環單鏈表判斷是否相交
若鍊錶相交,一定是尾相交,因此提前算出倆鍊錶長度,然後雙指標分別指向兩個鍊錶的頭部,長的鍊錶先提前移動到相同長度的位置,之後雙指標同時移動,若相交則雙指標必能相遇。總複雜度為
/*
author owen_q
*//**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
t = headb;
while(t!=null)
while(an>bn)
while(bn>an)
while(an>0)
return null;}};
這題還有個很巧妙的解法,就是兩個指標分別按不同順序遍歷兩個鍊錶,若鍊錶相交則雙指標也必定會相遇。這個演算法的複雜度將會降為
/*
author owen_q
*//**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
return a;}};
將上述兩個問題結合,又可以形成乙個新的問題,即判斷兩個可能帶環的鍊錶是否存在交點
由於鍊錶可能帶環,因此長度型和遍歷型鍊錶判環方法都無法適用。於是不如先判環,下面分類討論可能存在的情況。
首先對兩個鍊錶判環
兩個鍊錶在環前相交,那麼兩個鍊錶的入環口定為同乙個節點,比較入環口即可
兩個鍊錶在環上相交,那麼同樣是利用快慢指標,讓不同速度的指標從不同入環口同時出發,若快慢指標可以相遇則為環上相交,而兩個入環口均可以被視為相交點
若慢指標跑了一圈後雙指標仍未相遇,則說明兩個鍊錶不相交
單向鍊錶是否有交點以及查詢交點
如何判斷是否有交點?兩個單向鍊錶,如果有交點,那麼它們最後的乙個結點必定是同乙個結點。我們可以找到鍊錶最後乙個結點,比較它們是否是同乙個結點。如果兩個鍊錶有交點,如何判斷交點的位置呢?把乙個鍊錶中的每乙個結點與另乙個鍊錶的中每乙個結點做比較,如果找到相同的,那麼這個相同的就是交點了。但是這個演算法的...
單向鍊錶是否有交點以及查詢交點
如何判斷是否有交點?兩個單向鍊錶,如果有交點,那麼它們最後的乙個結點必定是同乙個結點。我們可以找到鍊錶最後乙個結點,比較它們是否是同乙個結點。如果兩個鍊錶有交點,如何判斷交點的位置呢?把乙個鍊錶中的每乙個結點與另乙個鍊錶的中每乙個結點做比較,如果找到相同的,那麼這個相同的就是交點了。但是這個演算法的...
鍊錶 找出兩個鍊錶的交點
一 暴力求解法 思路 有2個鍊錶,所以我們可以使用雙重迴圈,先遍歷第乙個鍊錶,在遍歷第乙個鍊錶的同時裡面巢狀遍歷第二個鍊錶。如下 這裡需要注意的是第二個鍊錶會多次的遍歷,所以遍歷完一次之後需要將指標?放到第乙個節點上面,這樣才可以繼續遍歷這個鍊錶。暴力法求解 遍歷2個鍊錶 param heada p...