問題:
給出兩個鍊錶的頭指標,判斷這兩個鍊錶是否相交。假設兩個鍊錶均不帶環。
分析與解法:
【解法一】
如果兩個鍊錶都無環,則可以把第二個鍊錶接在第乙個鍊錶後面,如果得到的鍊錶有環,則說明這兩個鍊錶相交。這裡如果有環,則第二個鍊錶的表頭一定在環上,只需要從第二個鍊錶開始遍歷,看是否會回到起點即可判斷。假設兩個鍊錶長度分別為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 ...