演算法 合併兩個排序的鍊錶

2021-08-04 21:02:17 字數 2185 閱讀 6684

題目:

輸入兩個遞增排序的鍊錶,合併著兩個鍊錶並使新鍊錶中的結點仍然是按照遞增順序的。例如輸入的鍊錶1和鍊錶2如下,合併後的為鍊錶3。鍊錶的結點定義如下:

解題思路:首先可以確定的是,鍊錶1和鍊錶2本身就是遞增的,所以合併的過程可以從鍊錶1,2的頭結點開始,先比較1,2的頭結點中值的大小,將小的值的結點(比如為鍊錶1頭結點)作為合併後的鍊錶(鍊錶3)的頭結點。隨後可以考慮成煉表1的從原鍊錶第二個結點開始,再次重複上面的步驟,這樣就變成了乙個遞迴問題。

**實現:

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

else

return pmergedhead;

}

測試例程:

#include

using

namespace

std;

struct listnode

;void showlist(listnode* l);

void createlist(listnode * l,int n,int initial);

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

int main()

void createlist(listnode * l,int n,int initial)

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

else

return pmergedhead;

}void showlist(listnode* l)

cout

結果如下:

個人感覺值得注意的地方有下面幾個:

(1)如果鍊錶1,2為空,要考慮**的魯棒性。

(2)要考慮鍊錶1,2中某結點的數值相等的情況,這個在else中包含了。

(3)遞迴呼叫何時退出?

遞迴退出的條件與為了防止空鍊錶造成異常的判斷是乙個:

if(phead1 == null)

return phead2;

else

if(phead2 == null)

return phead1;

這就是這個**很巧妙的地方,往往使一行**兩個甚至多個作用,我們舉這樣的例子:

鍊錶1 : 1 3

鍊錶2 : 2 4

首先執行merge(1,2)函式,進入if,

進入第一次遞迴,執行merge(3,2),顯然會進入else,

進入第二次遞迴,執行merge(3,4),顯然會進入if,

進入第三次遞迴,執行merge(null,4),此時就進入了是否為空的判斷,並返回4,同時遞迴結束。

(4)新的鍊錶何時鏈結?

我們可以這樣理解這件事,還是上面的例子:

鍊錶1 : 1 3

鍊錶2 : 2 4

**會第一次進入後再遞迴三次,遞迴結束後要return四次(從裡向外),每一次return時都會將鍊錶向前鏈結乙個結點,每一次return的結果其實是這樣:

1. 4

2. 3 4

3. 2 3 4

4.1 2 3 4

演算法 合併兩個排序鍊錶

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。方法一 遞迴 public class listnode public class solution if list2 null 找到合併鍊錶的第乙個值,然後把其餘的加到它的後面 if list1.val l...

演算法 合併兩個排序的鍊錶

題目 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。思路 遞迴呼叫 首先判斷兩個鍊錶非空 接著定義答案節點,小的就賦值給answer,遞迴求出answer.next package lg.nowcoder author liguo description...

合併兩個排序鍊錶

struct listnode class solution else while pstart1 null pstart2 null plast next pstart1 plast pend1 pend1 pend1 next pstart1 pend1 else plast next psta...