劍指Offer面試題 16 合併兩個排序的鍊錶

2021-09-07 22:37:45 字數 2396 閱讀 3173

ps:這也是一道出鏡率極高的面試題,我相信很多童鞋都會很眼熟,就像於千萬人之中遇見不期而遇的人,沒有別的話可說,唯有輕輕地問一聲:「哦,原來你也在這裡? 」

題目:輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照遞增排序的。例如輸入下圖中的鍊錶1和鍊錶2,則合併之後的公升序鍊錶如鍊錶3所示。

鍊錶結點定義如下,使用c#描述:

public

class

node

//指向後乙個節點

public node next

public node(int

data)

public node(int

data, node next)

}

step1.定義乙個指向新鍊錶的指標,暫且讓它指向null;

step2.比較兩個鍊錶的頭結點,讓較小的頭結點作為新鍊錶的頭結點;

step3.遞迴比較兩個鍊錶的其餘節點,讓較小的節點作為上乙個新節點的後乙個節點;

public

node merge(node head1, node head2)

else

if (head2 == null

)

node newhead = null

;

if (head1.data <=head2.data)

else

return

newhead;

}

(1)借助msunit框架進行初始化與清理工作[testinitialize]與[testcleanup]

private

mergehelper mergehelper;

[testinitialize]

public

void

initialize()

[testcleanup]

public

void

cleanup()

(2)封裝乙個便於測試對比的輔助方法,將新鍊錶生成乙個字串用於對比

public

string

getliststring(node head)

stringbuilder sblist = new

stringbuilder();

while (head != null

)

return

sblist.tostring();

}

(1)功能測試

//

list1: 1->3->5

//list2: 2->4->6

[testmethod]

public

void

mergetest1()

//兩個鍊錶中有重複的數字

//list1: 1->3->5

//list2: 1->3->5

[testmethod]

public

void

mergetest2()

(2)特殊輸入測試

//

兩個鍊錶都只有乙個數字

//list1: 1

//list2: 2

[testmethod]

public

void

mergetest3()

//兩個鍊錶中有乙個空鍊錶

//list1: 1->3->5

//list2: null

[testmethod]

public

void

mergetest4()

//兩個鍊錶都是空鍊錶

//list1: null

//list2: null

[testmethod]

public

void

mergetest5()

(1)測試通過情況

(2)**覆蓋率

出處:

劍指offer 面試題16

include 思路 遍歷鍊錶過程中,將各個指標入棧,再出棧進行反轉 listnode reverselist listnode phead pnode pnodestack.top listnode pfront pnode pnodestack.pop while pnodestack.empt...

劍指offer 面試題16 反轉鍊錶

題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個...

劍指Offer面試題16 反轉鍊錶

反轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出翻轉後鍊錶的頭結點。分析 假設h,i,j三個節點。h節點已經指向前面的節點,i節點要指向h節點,這時,i與j中間斷開,因此在將i節點指向 h節點之前,先記下j節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...