程式設計判斷倆個鍊錶是否相交
給出倆個單向鍊錶的頭指標,比如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表,然後針對第二個鍊錶的每個節點的...