劍指offer36 兩個鍊錶的第乙個公共結點

2022-05-24 19:03:09 字數 3077 閱讀 3956

輸入兩個鍊錶,找出它們的第乙個公共結點。

方法一:

用兩個指標同時從兩個鍊錶的表頭開始走,當走到自己的鍊錶結尾的時候開始從另乙個鍊錶的表頭開始向後走。終止條件就是兩個指標第一次相遇。此時指標位置即為所求。(兩個鍊錶的節點和是一定的,所以兩個指標一定可以同時遍歷完兩條鍊錶,即在最後時刻兩個指標一定是重合的)

方法2:

先數出兩條鍊錶的長度,得到長度差d,先將長鍊錶從頭結點往後走d步,之後第二個鍊錶從頭開始,兩個鍊錶一起一步一步走,直到兩個鍊錶的節點第一次相等為止,此時指標位置即為所求。

1 listnode* findfirstcommonnode( listnode *phead1, listnode *phead2) 

8return

p1;9 }

view code

1     listnode* findfirstcommonnode( listnode* phead1, listnode*phead2) 

9while(p2!=null)

13if(len1>len2)

18else

23for(int i=0;i)

26while(p1!=null && p2!=null)

32return

p1;33 }

view code

1 #include2

using

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

view code

完整**)

劍指offer 36 兩個鍊錶的第乙個公共結點

題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 實現 public class listnode public class solution return nhead1 分析 最直接的思路是遍歷一條鍊錶,並將每...

劍指offer 36 兩個鍊錶的第乙個公共結點

36.兩個鍊錶的第乙個公共結點 輸入兩個鍊錶,找出它們的第乙個公共結點。兩個指標同時遍歷兩個鍊錶,每個指標遍歷完當前鍊錶繼續遍歷另一鍊錶,當兩個指標相等或者某個指標為空時退出迴圈 定義兩個指標,第一輪讓兩個到達末尾的節點指向另乙個鍊錶的頭部,最後如果相遇則為交點 假定 p1 指向表 a p2 指向表...

劍指offer36 兩個鍊錶的第乙個公共子節點

輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 因為公共節點之後的資料都是一樣的,所以如果兩個鍊錶不一樣長,如果存在公共尾,那麼長的鍊錶前一段一定是不匹配的 struct listnode class solution ...