---------
個人認為,演算法永遠是王道。此處將擷取程式設計之美這本書上經典的演算法題,以饗各位。
同時,除了旁徵博引之外,也會加入我個人的思考。所寫之處,望不吝賜教。
july 2023年10月。
------------------------------------------
1.程式設計判斷倆個鍊錶是否相交
給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。
為了簡化問題,我們假設倆個鍊錶均不帶環。
問題擴充套件:
1.如果鍊錶可能有環列?
2.如果需要求出倆個鍊錶相交的第乙個節點列?
以下是演算法實現部分:
如何判斷乙個單鏈表是有環的?(注意不能用標誌位,最多只能用兩個額外指標)
一種o(n)的辦法就是
用兩個指標,乙個每次遞增一步,乙個每次遞增兩步,如果有環的話兩者必然重合,反之亦然:
bool check(const node* head)
return false;}
擴充套件1:如果鍊錶可能有環,則如何判斷兩個鍊錶是否相交
思路:鍊錶1 步長為1,鍊錶2步長為2 ,如果有環且相交則肯定相遇,否則不相交
list1 head: p1
list2 head: p2
while( p1 != p2 && p1 != null && p2 != null )
//因為當鍊表有環但不相交時,此處是死迴圈。!
if ( p1 == p2 && p1 && p2) //相交
else //不相交
//july:如果鍊錶帶環 但不相交列? 此演算法,還可行麼?
於此,還得好好總結下,問題得這樣解決:
1.先判斷帶不帶環
2.如果都不帶環,就判斷尾節點是否相等
3.如果都帶環,那麼乙個指標步長為1遍歷一鍊錶,
另一指標,步長為2,遍歷另乙個鍊錶。
但第3點,如果帶環 但不相交,那麼程式會陷入死迴圈。。
所以,此方法只適用於帶環且相交的情況下才有用。
問題解決之道:
我們在判斷鍊錶帶環的時候,用倆指標遍歷其中一條鍊錶,若帶環則此倆指標將相遇於一節點,
即,據此節點,看在不在另一條鍊錶上。如果在,則相交,如果不在,則不相交。
至此,問題,方才得到較圓滿解決。!
1.先判斷帶不帶環
2.如果都不帶環,就判斷尾節點是否相等
3.如果都帶環,判斷一煉表上倆指標相遇的那個節點,在不在另一條鍊錶上。
如果在,則相交,如果不在,則不相交。
july 2023年10月
-------------------------------
july(786165179)
20:28:53
ei,以倆指標
分別遍歷倆個鍊錶時,
倆指標
各自相遇的點,應該可以處在
同乙個點吧
july(786165179)
20:30:41
好比,ab一快一慢跑一有圈的跑道
cd 一快一慢也跑一有圈的跑道
如果,這倆跑道
是相同的距離列?
那麼 ab
cd 相遇的點就一定在同一座標點了...對吧
july(786165179)
20:31:39
那麼,只要找出ab
相遇的點
p,然後再判斷
這個點
p在不在另一條鍊錶上,即ok了。
------------
擴充套件2:求兩個鍊錶相交的第乙個節點
思路:在判斷是否相交的過程中要分別遍歷兩個鍊錶,同時記錄下各自長度。
分享:
程式設計之美 判斷兩鍊錶是否相交
程式設計之美 裡面有一篇是講如何判斷兩鍊錶是否相交,讀後覺得原文太過囉嗦。於是,筆者總結了一下,此類問題可以擴充套件為兩大類,分別是 1 單鏈表與環問題 2 單鏈表相交與環問題 本文 給定兩單鏈表a b,只給出兩頭指標。請問 1 如何判斷兩單鏈表 無環 是否相交?有兩種可取的辦法 1 人為構環,將鍊...
程式設計之美 判斷兩鍊錶是否相交
程式設計之美 裡面有一篇是講如何判斷兩鍊錶是否相交,讀後覺得原文太過囉嗦。於是,筆者總結了一下,此類問題可以擴充套件為兩大類,分別是 1 單鏈表與環問題 鍊錶與環問題 2 單鏈表相交與環問題 本文 給定兩單鏈表a b,只給出兩頭指標。請問 1 如何判斷兩單鏈表 無環 是否相交?有兩種可取的辦法 1 ...
程式設計之美 判斷兩個鍊錶是否相交
首先,判斷乙個鍊錶是否有環?對於這個問題 可以用兩個指標,剛開始都指向頭節點,然後乙個指標每次向後移一步,另乙個指標每次向後移兩步,如果最後移兩步的指標為空時,說明無環,如果最後兩個指標相等,說明有環。如果把第一指標看成靜止,則相當於第二個每次走一步,所以在那個環上時,是一定能相遇的。如何找到這個鍊...