常見鏈表面試題之判斷鍊錶是否相交,並求交點

2022-05-10 02:09:04 字數 1425 閱讀 9306

給定我們兩個鍊錶,在這裡,我們先討論單鏈表不帶環的情況,我們該怎麼判斷它們是否相交?並求出其交點呢。

首先我們來分析一下兩個鍊錶相交都有哪幾種情況。第一種就是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函式:

1

intlength(pnode phead)29

while

(pnode)

1014

return

len;

15 }

getcrossnode求交點函式:

1

pnode 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...