輸入兩個鍊錶,找出它們的第乙個公共結點。
方法一:
用兩個指標同時從兩個鍊錶的表頭開始走,當走到自己的鍊錶結尾的時候開始從另乙個鍊錶的表頭開始向後走。終止條件就是兩個指標第一次相遇。此時指標位置即為所求。(兩個鍊錶的節點和是一定的,所以兩個指標一定可以同時遍歷完兩條鍊錶,即在最後時刻兩個指標一定是重合的)
方法2:
先數出兩條鍊錶的長度,得到長度差d,先將長鍊錶從頭結點往後走d步,之後第二個鍊錶從頭開始,兩個鍊錶一起一步一步走,直到兩個鍊錶的節點第一次相等為止,此時指標位置即為所求。
1 listnode* findfirstcommonnode( listnode *phead1, listnode *phead2)view code8return
p1;9 }
1 listnode* findfirstcommonnode( listnode* phead1, listnode*phead2)view code9while(p2!=null)
13if(len1>len2)
18else
23for(int i=0;i)
26while(p1!=null && p2!=null)
32return
p1;33 }
1 #include2view codeusing
namespace
std;34
struct
listnode5;
910//建立鍊錶節點
11 listnode* createlistnode(int
value)
1219
2021
//連線鍊錶節點
22void connectlistnodes(listnode* pcurrent, listnode*pnext)
2330
31 pcurrent->m_pnext =pnext;32}
3334
35//
銷毀鍊錶
36void destroylist(listnode*phead)
3746}47
48//
銷毀節點
49void destroynode(listnode*pnode)
5054
55//
求鍊錶的長度
56 unsigned int getlistlength(listnode*phead)
5766
67return
nlength;68}
6970
//找第乙個公共節點
71 listnode* findfirstcommonnode(listnode *phead1, listnode *phead2)
7286
87//
先在長鍊表上走幾步,再同時在兩個鍊錶上遍歷
88for (int i = 0; i < nlengthdif; i++)
8992
93while ((plistheadlong!=null)&& (plistheadshort != null)&&(plistheadlong !=plistheadshort))
9498
99//
得到第乙個公共節點
100 listnode* pfisrtcommonnode =plistheadlong;
101//
listnode* pfisrtcommonnode = plistheadshort;也可以
102103
return
pfisrtcommonnode;
104}
105106
107//
********************測試**********************
108void test(char* testname, listnode* phead1, listnode* phead2, listnode*pexpected)
109114
115 listnode* presult =findfirstcommonnode(phead1, phead2);
116if (presult ==pexpected)
117120
else
121124
}125
126127
//第乙個公共結點在鍊錶中間
128//
1 - 2 - 3 \
129//
6 - 7
130//
4 - 5 /
131void
test1()
132158
159//
沒有公共結點
160//
1 - 2 - 3 - 4
161//
162//
5 - 6 - 7
163void
test2()
164184
185//
公共結點是最後乙個結點
186//
1 - 2 - 3 - 4 \
187//
7188
//5 - 6 /
189void
test3()
190216
217//
公共結點是第乙個結點
218//
1 - 2 - 3 - 4 - 5
219//
兩個鍊錶完全重合
220void
test4()
221237
238//
輸入的兩個鍊錶有乙個空鍊錶
239void
test5()
240256
257//
輸入的兩個鍊錶都是空鍊錶
258void
test6()
259262
263264
intmain()
265
完整**)
劍指offer 36 兩個鍊錶的第乙個公共結點
題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 實現 public class listnode public class solution return nhead1 分析 最直接的思路是遍歷一條鍊錶,並將每...
劍指offer 36 兩個鍊錶的第乙個公共結點
36.兩個鍊錶的第乙個公共結點 輸入兩個鍊錶,找出它們的第乙個公共結點。兩個指標同時遍歷兩個鍊錶,每個指標遍歷完當前鍊錶繼續遍歷另一鍊錶,當兩個指標相等或者某個指標為空時退出迴圈 定義兩個指標,第一輪讓兩個到達末尾的節點指向另乙個鍊錶的頭部,最後如果相遇則為交點 假定 p1 指向表 a p2 指向表...
劍指offer36 兩個鍊錶的第乙個公共子節點
輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 因為公共節點之後的資料都是一樣的,所以如果兩個鍊錶不一樣長,如果存在公共尾,那麼長的鍊錶前一段一定是不匹配的 struct listnode class solution ...