面試題25 合併兩個排序的鍊錶

2021-08-29 03:50:58 字數 1201 閱讀 1935

一、題目

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

二、關鍵

1.遞迴過程,使用遞迴函式解決。

2.乙個鍊錶是空的,結果是不為空的那個。

三、解釋

1.合併兩個鍊錶的過程:鍊錶1的頭結點的值小於鍊錶2的頭結點的值,因此鍊錶2的頭結點就是合併後的鍊錶的頭結點。相反,那麼鍊錶2的頭結點就是合併後的鍊錶的頭結點。

2.遞迴過程:當我們得到兩個鍊錶中值較小的那個頭結點,並把它連線到已合併的的鍊錶中後,兩個鍊錶剩餘的節點依然是排序的,因此合併的步驟和之前的步驟是一樣的。這個就是典型的遞迴過程,我們可以定義遞迴函式完成這個合併過程。

3.疑惑:找到每次呼叫時,找到頭結點之後,將頭結點和之前已經合併好的鍊錶的尾節點連線起來這部分,不是很懂。

四、**

#include #include "..\utilities\list.h"

listnode* merge(listnode* phead1, listnode* phead2)

else

return pmergedhead;

}// ********************測試**********************

listnode* test(char* testname, listnode* phead1, listnode* phead2)

// list1: 1->3->5

// list2: 2->4->6

void test1()

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

// list1: 1->3->5

// list2: 1->3->5

void test2()

// 兩個鍊錶都只有乙個數字

// list1: 1

// list2: 2

void test3()

// 乙個鍊錶為空鍊錶

// list1: 1->3->5

// list2: 空鍊錶

void test4()

// 兩個鍊錶都為空鍊錶

// list1: 空鍊錶

// list2: 空鍊錶

void test5()

int main(int argc, char* argv)

面試題25 合併兩個排序鍊錶

題目 輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照遞增排序的。include include list.h using namespace std struct listnode listnode mergetwolists listnode phead1,listnode p...

面試題25 合併兩個排序的鍊錶

輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是遞增排序的。定義兩個指標,分別指向這兩個鍊錶的第乙個結點。當第乙個結點的值小於第二個結點的值時,鍊錶1的頭結點將是合併後的鍊錶的頭結點。繼續比較兩個頭結點,如果第二個結點的值小,鍊錶2的頭結點將是合併剩餘結點得到的鍊錶的頭結點。packa...

面試題25 合併兩個排序的鍊錶

題目 輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的節點仍然是遞增排序的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 限制 0 鍊錶長度 1000 鍊錶結構 struct listnode 因為需要生成乙個全新的鍊錶,那麼我們就重新建立乙個鍊錶來儲存遞增排序鍊錶,然後每次...