《劍指Offer》面試題17 合併兩個排序的鍊錶

2021-08-20 19:33:26 字數 2108 閱讀 4331

《劍指offer》面試題17:合併兩個排序的鍊錶

鍊錶和遞迴

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

首先分析合併兩個鍊錶的過程。我們的分析從合併兩個鍊錶的頭結點開始。鍊錶1的頭結點的值小於鍊錶2的頭結點的值,因此鍊錶1的頭結點將是合併後鍊錶的頭結點,如圖所示:

我們繼續合併兩個鍊錶中剩餘的結點。在兩個鍊錶中剩下的結點依然是排序的,因此合併這兩個鍊錶的步驟和前面的步驟是一樣的。我們還是比較兩個頭結點的值。此時鍊錶2的頭結點的值小於鍊錶1的頭結點的值,因此鍊錶2的頭結點的值將是合併剩餘結點得到的鍊錶的頭結點。我們把這個結點和前面合併鍊錶時得到的鍊錶的尾節點鏈結起來,如圖所示。

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

接下來我們來解決魯棒性的問題。每當**試圖訪問空指標指向的記憶體時程式就會崩潰,從而導致魯棒性問題。在本題中一旦輸入空的鍊錶就會引入空的指標,因此我們要對空鍊錶單獨處理。當第乙個鍊錶是空鍊錶,也就是它的頭結點是乙個空指標時,那麼把它和第二個鍊錶合併,閒人合併的過程就是第二個鍊錶。同樣,當輸入的第二個鍊錶的頭結點是空指標的時候,我們把它和第乙個鍊錶合併得到的結果就是第乙個鍊錶。如果兩個鍊錶都是空鍊錶,合併的結果是得到乙個空鍊錶。

/*《劍指offer——名企面試官精講典型程式設計題》**

著作權所有者:何海濤*/

#include "stdio.h"

#include "cstdlib"

struct listnode

;listnode* createlistnode(int value)

void connectlistnodes(listnode* pcurrent, listnode* pnext)

pcurrent->m_pnext = pnext;

}void printlistnode(listnode* pnode)

else }

void printlist(listnode* phead)

printf("\nprintlist ends.\n");

}void destroylist(listnode* phead)

}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()

劍指offer 面試題17

題目 合併兩個排序的單向鍊錶 自己所寫 如下 listnode mergesortedlists listnode phead1,listnode phead2 listnode mergetwolist listnode pfirst,listnode psecond if phead pnext...

劍指offer 面試題17 合併兩個排序的鍊錶

題目 輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照遞增排序的。思路 每次從兩個鍊錶中選取較小的結點作為新鍊錶的結點,那麼這裡有兩種方法,迴圈或者遞迴。1 迴圈,每次取出兩個鍊錶中較小的結點插入新鍊錶,到達其中乙個鍊錶的尾結點時,另外乙個鍊錶的其餘部分直接接在這個尾結點上。2 從...

劍指offer之面試題17 合併兩個排序的鍊錶

題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。思路 養成好習慣,一旦有鍊錶作為形參傳遞,都要對鍊錶是否為空做判斷,防止空指標異常,至於怎麼處理,稍後會講。當鍊表都不為空時,比較兩個鍊錶的頭結點值的大小,較小者作為新的頭結點儲存,不妨設較小的頭結...