一、題目
輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照遞增排序的。例如輸入圖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 因為需要生成乙個全新的鍊錶,那麼我們就重新建立乙個鍊錶來儲存遞增排序鍊錶,然後每次...