鍊錶 兩個有序鍊錶的合併

2021-10-05 07:41:40 字數 1862 閱讀 8573

題目要求:

本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。

函式介面定義:
list merge

( list l1, list l2 )

;

其中list結構定義如下:

typedef

struct node *ptrtonode;

struct node

;typedef ptrtonode list;

/* 定義單鏈表型別 */

l1和l2是給定的帶頭結點的單鏈表,其結點儲存的資料是遞增有序的;函式merge要將l1和l2合併為乙個非遞減的整數序列。應直接使用原序列中的結點,返回歸併後的帶頭結點的煉表頭指標。

裁判測試程式樣例:
#include

#include

typedef

int elementtype;

typedef

struct node *ptrtonode;

struct node

;typedef ptrtonode list;

list read()

;/* 細節在此不表 */

void

print

( list l )

;/* 細節在此不表;空煉表將輸出null */

list merge

( list l1, list l2 )

;int

main()

/* 你的**將被嵌在這裡 */

輸入樣例:
3

1 3 5

52 4 6 8 10

輸出樣例:
1 2 3 4 5 6 8 10

null

null

演算法思想:

將兩個鍊錶l1和l2從分別從第乙個結點開始進行比較,較小的連在l上,然後繼續讓未遍歷的l1,l2的結點進行分別比較,當某乙個鍊錶遍歷結束後,進行判斷,將未遍歷完的鍊錶全部鏈到l後面。

注意:兩個鍊錶l1,l2帶頭結點。

函式:

/*

【注意】

1.兩個鍊錶l1,l2帶頭結點

2.臨時指標pl1和l1本質上並沒有區別,都是實參l1的副本,使用pl1的目的是

在函式中pl1作為移動的指標進行鏈結,而l1始終指向頭結點(注意即使在函

數中更改l1的指向,實參l1的指向也不會發生變化,不過函式最後的將l1置為

空這一步會出問題)

*//*

【解題思路】

將兩個鍊錶l1和l2分別從第乙個結點開始進行比較,較小的連在l上,然後

繼續讓未遍歷的l1,l2的結點進行分別比較,當某乙個鍊錶遍歷結束後,進行

判斷,將未遍歷完的鍊錶全部鏈到l後面

*/

list merge

(list l1,list l2)

else

}//此時某乙個鍊錶已經遍歷結束,下面進行判斷,將未遍歷的鍊錶全部鏈到l後面

if(pl1)

l -> next = pl1;

else

if(pl2)

l -> next = pl2;

//根據題目要求,將l1和l2置為空

l1 -> next =

null

; l2 -> next =

null

;return l0;

//返回l的頭結點

}

鍊錶 合併兩個有序鍊錶

標籤 鍊錶 題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。解題思路 兩種解法 遞迴和非遞迴 拓展 參考 public listnode merge listnode list1,listnode list2 else 非遞迴 public li...

鍊錶 21 合併兩個有序鍊錶

題目 將兩個公升序鍊錶合併為乙個新的公升序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 解體方法 暴力法和遞迴 暴力法思路 首先鍊錶這種資料結構是乙個只能從頭訪問的,本題中,因為兩個鍊錶中的頭節點都要先進行比較之後才能確...

LeetCode 鍊錶 合併兩個有序鍊錶

將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 使用迭代。如下 definition for singly linked list.struct listnode listnode ...