1. 程式人生 > >【浙大資料結構題集】習題2.5 兩個有序連結串列序列的合併

【浙大資料結構題集】習題2.5 兩個有序連結串列序列的合併

題目連結

題意:兩個有序連結串列的合併,輸出的合併後的非遞減連結串列。

思路:主要是輸入和合並兩個函式,輸入用的尾插法,合併則是一一比較,複雜度O(m+n).

程式碼:

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 細節在此不表 */
void Print( List L ); /* 細節在此不表;空連結串列將輸出NULL */ List Merge( List L1, List L2 ); int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } List Read() { List r,L=(struct Node*)malloc(sizeof(struct Node)); L->
Next=NULL; r=L; int n; scanf("%d",&n); while(n--) {///尾插法 Node *p=(struct Node*)malloc(sizeof(struct Node)); scanf("%d",&p->Data); p->Next=NULL; r->Next=p; r=p; } return L; } List Merge(List L1,List L2) { List pa,pb,pc,L; L=
(struct Node*)malloc(sizeof(struct Node)); pc=L; pa=L1->Next,pb=L2->Next; while(pa&&pb) { if(pa->Data <= pb->Data) { ///取pa所指節點 pc->Next=pa; ///將pa所指節點連結到pc所指結點之後 pc=pa; ///pc指向pa pa=pa->Next; ///pa指向下一節點 } else { ///取pb所指節點 pc->Next=pb; pc=pb; pb=pb->Next; } } pc->Next=pa?pa:pb; ///將非空連結串列的剩餘段插入到pc所指節點後 L1->Next=NULL; ///這裡是根據題目要求輸出合併後原連結串列的頭結點所新增的。 L2->Next=NULL; // return L; } void Print(List L) { if(L->Next) { List r=L; while(r->Next) { r=r->Next; printf("%d ",r->Data); } puts(""); } else { printf("NULL\n"); } }