非遞減合併兩個有序單鏈表
阿新 • • 發佈:2019-02-10
#include <iostream> #include <cstdio> #include <stdlib.h>//malloc函式標頭檔案 using namespace std; typedef struct Node { int data; struct Node * next; } LNode,*LinkList;//直接定義節點指標,這樣程式碼指標不會出現*,簡潔 LinkList built(int n) { LinkList p,r,list; list=(LinkList)malloc(sizeof(LNode)); list->next=NULL; for(int i=0; i<n; i++) { int d; scanf("%d",&d); p=(LinkList)malloc(sizeof(LNode)); p->data=d; p->next=NULL; if(list->next==NULL) list->next=p; else r->next=p; r=p; } return (list); } LinkList ListMerger(LinkList ListA,LinkList ListB)//兩個連結串列的合併 { LinkList pa,pb,pc,ListC; ListC=(LinkList)malloc(sizeof(LNode)); pa=ListA->next; pb=ListB->next; pc=ListC; pc->next=NULL; while(pa&&pb) { if(pa->data<pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } pc->next=pa?pa:pb;//指向剩餘的連結串列 return ListC; } int main() { int n,m; while(scanf("%d %d",&n,&m)!=EOF) { if(!n&&!m) { printf("NULL\n"); continue; } LinkList ra=built(n); LinkList rb=built(m); LinkList t=ListMerger(ra,rb); if(t->next!=NULL)t=t->next; while(t->next!=NULL) { cout<<t->data<<" "; t=t->next; } cout<<t->data<<endl; } return 0; }