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

2021-07-07 03:03:26 字數 1323 閱讀 6081

問題:

給出兩個鍊錶的頭指標,判斷這兩個鍊錶是否相交。假設兩個鍊錶均不帶環。

分析與解法:

【解法一】

如果兩個鍊錶都無環,則可以把第二個鍊錶接在第乙個鍊錶後面,如果得到的鍊錶有環,則說明這兩個鍊錶相交。這裡如果有環,則第二個鍊錶的表頭一定在環上,只需要從第二個鍊錶開始遍歷,看是否會回到起點即可判斷。假設兩個鍊錶長度分別為m和n,則時間複雜度為o(m+n)。

【解法二】

若兩個鍊錶都無環且交於一點,那麼最後乙個節點一定是共有的。可以先遍歷第乙個鍊錶,記錄最後乙個節點,再遍歷第二個鍊錶,將其最後乙個節點與第乙個鍊錶的最後乙個節點比較,若相同,則相交。時間複雜度也為o(m+n)。

擴充套件問題:

若鍊錶可能有環該如何求解。

求兩個鍊錶相交的第乙個節點。

【問題1】

首先要判斷有頭指標的單鏈表是否有環。

解法:使用追逐的方法,設定兩個指標slow、fast,從頭指標開始,每次分別前進1步、2步。如果存在環,則兩者相遇;如果不存在環,fast遇到null退出。

bool i***istloop(linklist *head)

return

!(fast ==

null

|| fast -> next ==

null});

}

【問題2】

同樣,使用追逐辦法先判斷是否存在環,分情況討論。

linklist findloopport(linklist *head)

if(fast ==

null

|| fast -> next ==

null})

return

null;

slow = head;//slow指向頭指標

while(slow != fast)//此時fast指向碰撞點

return slow;

}

int looplength(linklist *head)

if(fast == null || fast -> next == null})

return

0; while(true)

return

length;

}

文章參考以下博文:

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

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

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

1.簡述 給出兩個鍊錶的頭指標,比如h1,h2,判斷這兩個鍊錶是否相交。這裡是為了簡化問題,我們假設兩個鍊錶不帶環。擴充套件 如果鍊錶可能有環呢?擴充套件 如何求出兩個相交鍊錶的相交的第乙個節點。2.分析 這道題,個人感覺理解的還是相對比較清楚完整。主要就是兩個問題,問題一,兩個鍊錶是否相交,問題二...

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

程式設計之美 3.6節 判斷兩個鍊錶是否相交 問題 給出兩個單項鍊表的頭指標,判斷這兩個鍊錶是否相交,假設都不帶環。解法 遍歷第乙個鍊錶至尾節點,然後遍歷第二個鍊錶,如果尾節點和剛才相同,則說明相交,否則不想交。includeusing namespace std struct node bool ...