判斷鍊錶相交 環

2021-07-07 05:18:59 字數 1401 閱讀 8664

程式設計判斷倆個鍊錶是否相交

給出倆個單向鍊錶的頭指標,比如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月

擴充套件2:求兩個鍊錶相交的第乙個節點

思路:在判斷是否相交的過程中要分別遍歷兩個鍊錶,同時記錄下各自長度。

node* step( node* p, node* q)

while( q->next )

result = ( p == q );

if ( result )

plen > qlen ? p = head : q = head;

while ( p != q )

reutrn p; }

return null; }

有環單鏈表相交判斷

如何判斷兩個有環單鏈表是否相交?相交的話返回第乙個相交的節點,不想交的話返回空。如果兩個鍊錶長度分別為n和m,請做到時間複雜度o n m 額外空間複雜度o 1 給定兩個鍊錶的頭結點head1和head2 注意,另外兩個引數adjust0和adjust1用於調整資料,與本題求解無關 請返回乙個bool...

鍊錶 相交結點與環問題

基本問題 1.兩個鍊錶中的第乙個公共結點 解題思路 a.先求得兩個鍊錶的長度,得到鍊錶長度差d b.根據鍊錶長度差,首先讓長鍊錶的指標先走d 1步,之後兩個指標一起走,發現相同結點時就是公共結點 int len1 0,len2 0 listnode p1 head1,p2 head2 while p...

鍊錶相交問題

1 判斷兩個鍊錶是否相交 假設兩個鍊錶均不帶環 有四種方法 解法1 直觀的想法 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中,這種方法的時間複雜度為o length h1 length h2 解法2 利用計數的方法 對第乙個鍊錶的節點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每個節點的...