1. 程式人生 > >兩個有序鏈表序列的合並

兩個有序鏈表序列的合並

ret nbsp str 是否 並集 link 表示 平時 math

7-51 兩個有序鏈表序列的合並(20 分)

已知兩個非降序鏈表序列S1與S2,設計函數構造出S1與S2的並集新非降序鏈表S3。

輸入格式:

輸入分兩行,分別在每行給出由若幹個正整數構成的非降序序列,用?1表示序列的結尾(?1不屬於這個序列)。數字用空格間隔。

輸出格式:

在一行中輸出合並後新的非降序鏈表,數字間用空格分開,結尾不能有多余空格;若新鏈表為空,輸出NULL

輸入樣例:

1 3 5 -1
2 4 6 8 10 -1

輸出樣例:

1 2 3 4 5 6 8 10
作者: DS課程組 單位: 浙江大學 時間限制: 1500ms 內存限制: 128MB
 1 #include<stdio.h>
 2
#include<stdlib.h> 3 4 typedef struct LNode{ 5 int data; 6 struct LNode *next; 7 }LNode,*LinkList; 8 9 void init(LinkList &L); 10 void read(LinkList &L); 11 void merge(LinkList La,LinkList Lb,LinkList &Lc); 12 void print(LinkList L); 13 14 int main(){ 15 LinkList la,lb,lc;
16 init(la); 17 init(lb); 18 init(lc); 19 read(la); 20 read(lb); 21 merge(la,lb,lc); 22 print(lc); 23 return 0; 24 } 25 26 27 void init(LinkList &L){ 28 L=(LinkList)malloc(sizeof(LNode)); 29 L->next = NULL; 30 } 31 void read(LinkList &L){ 32 LinkList p,tem;
33 int e; 34 tem=L; 35 36 scanf("%d",&e); 37 while(e>0){ 38 p=(LinkList)malloc(sizeof(LNode)); 39 p->data=e; 40 p->next=NULL; 41 tem->next=p; 42 tem=p; 43 scanf("%d",&e); 44 } 45 } 46 47 void print(LinkList L){ 48 LinkList p=L->next; 49 if(!p){ 50 printf("NULL"); 51 } 52 else{ 53 printf("%d",p->data); 54 p=p->next; 55 while(p){ 56 printf(" %d",p->data); 57 p=p->next; 58 } 59 } 60 } 61 62 void merge(LinkList La,LinkList Lb,LinkList &Lc){ 63 LinkList pa,pb,pc; 64 pa=La->next;pb=Lb->next; 65 Lc=pc=La; 66 while(pa&&pb){ 67 if(pa->data<=pb->data){ 68 pc->next=pa; 69 pc=pa; 70 pa=pa->next; 71 } 72 else{ 73 pc->next=pb; 74 pc=pb; 75 pb=pb->next; 76 } 77 } 78 pc->next=pa?pa:pb; 79 free(Lb); 80 }

總結:

這一題是第一次體驗運用剛學的數據結構來刷算法題,平時的題目只是要求我們做出特定功能的算法的函數就行,而OJ題需要我們寫出能運行的代碼,就需要有 main函數、數據結構定義,函數聲明及定義,缺一不可。

這一題需要註意的地方是‘read函數和輸出格式’,其他諸如初始化操作、鏈表合並操作都是約定俗成的。read函數需要一次性讀入所有值放到鏈表中,並遇到-1停止,因為這一題輸入的都是正整數,就可以通過是否>0來確定是否輸入完畢,該函數中循環的地方還要格外註意。輸出格式問題是,若為空,輸出NULL,所以單獨列出這種可能性的操作;若不為空,合並後的鏈表各結點的值需用空格隔開,但最後一個元素後面沒有空格,我的方法是先單獨輸出第一個結點的值,再按“空格+值”的格式輸出。

兩個有序鏈表序列的合並