程式設計之美 鍊錶是否相交

2021-06-09 23:30:49 字數 2493 閱讀 5447

---------

個人認為,演算法永遠是王道。此處將擷取程式設計之美這本書上經典的演算法題,以饗各位。

同時,除了旁徵博引之外,也會加入我個人的思考。所寫之處,望不吝賜教。

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 ...

程式設計之美 判斷兩個鍊錶是否相交

首先,判斷乙個鍊錶是否有環?對於這個問題 可以用兩個指標,剛開始都指向頭節點,然後乙個指標每次向後移一步,另乙個指標每次向後移兩步,如果最後移兩步的指標為空時,說明無環,如果最後兩個指標相等,說明有環。如果把第一指標看成靜止,則相當於第二個每次走一步,所以在那個環上時,是一定能相遇的。如何找到這個鍊...