兩個有序鏈表序列的合並


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,所以單獨列出這種可能性的操作;若不為空,合並后的鏈表各結點的值需用空格隔開,但最后一個元素后面沒有空格,我的方法是先單獨輸出第一個結點的值,再按“空格+值”的格式輸出。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM