兩個有序鍊錶序列的合併

2021-10-03 07:56:19 字數 2249 閱讀 1243

浙江大學mooc資料結構第二週程式設計作業----兩個有序鍊錶的合併

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

函式介面定義:

list merge

( list l1, list l2 )

;

其中list結構定義如下:

typedef

struct node *ptrtonode;

struct node

;typedef ptrtonode list;

/* 定義單鏈表型別 */

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

裁判測試程式樣例:

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

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

輸入樣例:31 3 5

52 4 6 8 10

輸出樣例:

1 2 3 4 5 6 8 10

null

null

read函式**實現如下:

list read()

r->next =

null

;return head;

}

print函式**實現如下:

void

print

(list l)

while

(p !=

null

)printf

("\n");

}

第一次提交的merge函式如下:

list merge

(list l1, list l2)

else

if(p->data > q->data)

}while

(p !=

null

)//當第乙個鍊錶還沒有掃瞄完

while

(q !=

null

)//當第二個鍊錶還沒掃瞄完

r->next =

null

; l1->next =

null

; l2->next =

null

;return l;

}

但結果是部分正確的:

經過修改後的**:

list merge

(list l1, list l2)

else

} r->next = p ? p : q;

//將沒有掃瞄完的鍊錶結點直接接到新煉表上

l1->next =

null

; l2->next =

null

;return l;

}

提交結果:

查詢原因:審題很重要!!!一開始的**,是建立了新的結點,而題目中說用原有兩個鍊錶的結點,因此前乙個**會出現記憶體超限的問題。

合併兩個有序鍊錶序列

本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。list merge list l1,list l2 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list 定義單鏈表型...

兩個有序鍊錶序列的合併

習題2.5 兩個有序鍊錶序列的合併 15分 本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。list merge list l1,list l2 其中list結構定義如下 typedef struct node ptrtonode struct node typedef...

兩個有序鍊錶序列的合併

已知兩個非降序鍊錶序列s1與s2,設計函式構造出s1與s2的並集新非降序鍊錶s3。輸入分兩行,分別在每行給出由若干個正整數構成的非降序序列,用 表示序列的結尾 不屬於這個序列 數字用空格間隔。在一行中輸出合併後新的非降序鍊錶,數字間用空格分開,結尾不能有多餘空格 若新鍊錶為空,輸出null。1 3 ...