給定我們兩個鍊錶,在這裡,我們先討論單鏈表不帶環的情況,我們該怎麼判斷它們是否相交?並求出其交點呢。
首先我們來分析一下兩個鍊錶相交都有哪幾種情況。第一種就是y型,它們從某乙個節點相交,第二種是v型,它們直到尾節點才相交。下面兩幅圖分別對應兩種情況。
1.y型相交
2. v型相交
其實不難發現,如果兩個鍊錶相交的話,它們的尾節點肯定是相同的。所以如果要判斷兩個鍊錶是否相交,我們可以遍歷兩個鍊錶,看它們的尾節點是否相等,相等就能判定其相交。iscross函式,如果相交返回1,否則返回0.
1要求其交點的話(第乙個交點),我們的思路應該很明顯,就是找到其中第乙個相等的節點,便是他們的第乙個交點。intiscross(pnode phead1, pnode phead2)211
while (pnode2->pnext !=null)
1215
if (pnode1 == pnode2) //
判斷尾節點是否相等
1619}20
return0;
21 }
但此時就要考慮怎麼進行節點的比較了,因為有y型和v型,我們不能直接從第乙個節點進行遍歷比較,所以應該再寫乙個length函式用來求鍊錶的長度,然後讓長的鍊錶先走,當走到一樣長的地方開始進行比較,找到相等的節點就返回這個節點。
length函式:
1getcrossnode求交點函式:intlength(pnode phead)29
while
(pnode)
1014
return
len;
15 }
1pnode getcrossnode(pnode phead1, pnode phead2)212
13if (step >= 0)14
19while
(pnode1)
2025 pnode1 = pnode1->pnext;
26 pnode2 = pnode2->pnext;27}
28}29else
3036
while
(pnode2)
3742 pnode1 = pnode1->pnext;
43 pnode2 = pnode2->pnext;44}
45}46return
null;
47 }
鏈表面試題 判斷鍊錶是否相交(c語言)
一 問題描述 判斷兩個鍊錶是否相交,若相交返回交點,否則返回空。這裡假設鍊錶不帶環 由上圖我們可以得出鍊錶相交的兩個結論 1.兩鍊錶相交,第乙個相同的結點為鍊錶的交點 2.兩鍊錶相交,從交點向後的所有結點都相同 合二為一 二 解決思路 方法一 直觀法 思路 依次判斷第乙個鍊錶中的每個結點是否在第二個...
鏈表面試題 判斷兩個鍊錶是否相交
判斷兩個鍊錶是否相交,若相交,求交點。假設鍊錶不帶環 判斷兩個鍊錶是否相交,若相交,求交點。假設鍊錶可能帶環 採用對齊的思想。計算兩個鍊錶的長度 l1 l2,分別用兩個指標 p1 p2 指向兩個鍊錶的頭,然後將較長鍊錶的 p1 假設為 p1 向後移動l2 l1個節點,然後再同時向後移動p1 p2,直...
鍊錶及鏈表面試題
首先看一下順序表和煉表的優缺點,分別在什麼場景下使用?源 list.h ifndef list h define list h include include include typedef int datatype typedef struct node node,pnode,plist init...