擴充套件
兩個鍊錶,判斷是否相交,找出相交的第乙個點?
如下面的兩個鍊錶:
在節點 c1 開始相交。
示例 1:
注意:
可能這輩子你我無法在一起,但有限次輪迴後我們終將在一起
複雜度分析:
**解答:
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
return p;}}
;
首先應該清楚兩個單鏈表相交要麼都是無環鏈表,要麼都是有環鏈表,不存在乙個有環鏈表和乙個無環鏈表相交,因為兩個鍊錶一旦相交則後續的鍊錶都應該是相同的將其中任意乙個鍊錶的環打破,即讓尾結點指向null(記下儲存原本應當指向的位置),然後判斷第二個鍊錶是否含有環,若第二個鍊錶無環則相交,否則不相交
利用判斷單鏈表是否有環的方法,對鍊錶使用兩個快慢指標進行判斷是否有環,兩個指標的碰撞點即在環上,那麼判斷鍊錶二的環上是否包含該碰撞點就可以判斷兩個鍊錶是否相交了
兩個無環鏈表相交
如果兩個單鏈表有共同的節點,那麼從第乙個節點開始,後面的節點都會重疊,直至鍊錶結束,因為兩個鍊錶中有乙個共同節點,則從這個節點裡的指標域指向下乙個節點的位址就相同,所以相交以後的節點就會相同,直至鍊錶結束,總的模型就像乙個「y」
解法:(1)暴力解法
從頭開始遍歷乙個鍊錶,遍歷第乙個鍊錶中的每個節點時,同時從頭到尾遍歷第二個鍊錶,看是否有相同的節點,第一次找到相同的節點即第乙個交點;若遍歷結束未找到相同的節點,即不存在交點,時間複雜度為o(n^2)
(2)遍歷鍊錶記錄長度
同時遍歷兩個鍊錶到尾部,同時記錄兩個鍊錶的長度。若兩個鍊錶最後的乙個節點相同,則兩個鍊錶相交。有兩個鍊錶的長度後,我們就可以知道哪個鍊錶長,設較長的鍊錶長度為len1,短的鍊錶長度為len2。
節點相同時,則這個節點就是第乙個相交的節點。(第二種方法其實是縮短了鍊錶比較的長度)時間複雜度為o(len1+len2)
(3)使用棧
我們可以從頭遍歷兩個鍊錶。建立兩個棧,第乙個棧儲存第乙個鍊錶的節點,第二個棧儲存第二個鍊錶的節點,直至鍊錶的所有節點入棧,通過取兩個棧的棧頂元素節點判斷是否相等即可判斷兩個鍊錶是否相交。從第乙個相交節點之後,後續節點均相交直至鍊錶結束。出棧直至兩個節點不相同時,則這個節點的後乙個節點是第乙個相交節點
(4)雜湊表法
既然兩個鍊錶一旦相交,相交節點一定有相同的記憶體位址,而不同的節點記憶體位址一定是不同的,那麼不妨利用記憶體位址建立雜湊表,如此通過判斷兩個鍊錶中是否存在記憶體位址相同的節點判斷兩個鍊錶是否相交。具體做法是:遍歷第乙個鍊錶,並利用位址建立雜湊表,遍歷第二個鍊錶,看看位址雜湊值是否和第乙個表中的節點位址值有相同即可判斷兩個鍊錶是否相交。時間複雜度o(length1 + length2)
兩個鍊錶都為有環情況
(1)第乙個交點在環開始之前
(2)第乙個交點在環入口處
(3)第乙個交點在環內
判斷相交方法:
針對(1)和(2)兩種情況我們可以採用和上述無環鏈表的判斷方法一樣,針對第三種有環鏈表,我們可以分別找到鍊錶一和鍊錶二的環入口節點,各自的環入口節點即為各自第一次相交的節點
劍指offer 兩個鍊錶第乙個公共結點
題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點。解題思路 用兩重迴圈,對第乙個鍊錶的每乙個結點都進行第二個鍊錶所有結點的遍歷,若發現結點相等,則將結點返回 public listnode findfirstcommonnode listnode phead1,listnode phead2 phe...
劍指offer 兩個鍊錶的第乙個公共結點(鍊錶)
輸入兩個鍊錶,找出它們的第乙個公共結點。公共節點指的是節點的指標相同 節點本身相同 而不是節點的內容相同。如果考慮暴力的方法,對於鍊錶1的每個元素,去遍歷鍊錶2,找出第乙個公共節點,這樣時間複雜度為o mn 計算開銷大 m,n分別為兩個鍊錶的長度 考慮具有公共節點的鍊錶的特徵 如果兩個鍊錶有公共節點...
劍指offer 兩個鍊錶的第乙個公共節點
題目延伸 程式設計之美中的求兩個節點是否相交 將兩個節點串在一起,若有節點,串在一起的節點就會出現環,利用一二不長不等,兩個節點在環中必然相遇。本題描述 輸入兩個鍊錶,找出它們的第乙個公共結點。分析 乙個簡單的方法是 首先遍歷兩個鍊錶得到它們的長度,就能知道哪個鍊錶比較長,以及長的鍊錶比短的鍊錶多幾...