將兩個有序遞增連結串列合併成一個有序遞增連結串列,要求結果仍使用原來兩個連結串列的儲存空間,不另外佔有空間。
阿新 • • 發佈:2019-01-03
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 20; typedef struct LNode{ int data; struct LNode *next; } LNode,*LinkList; LinkList mergelinklist(LinkList La,LinkList Lb); int main(){ LinkList La,Lb; int n,m; La=(LinkList)malloc(sizeof(LNode)); La->next=NULL; Lb=(LinkList)malloc(sizeof(LNode)); Lb->next=NULL; scanf("%d %d",&n,&m); LinkList last=La; for(int i=0;i<n;i++) { LinkList p; p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=NULL; last->next=p; last=last->next; } last=Lb; for(int i=0;i<m;i++) { LinkList p; p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=NULL; last->next=p; last=last->next; } La=mergelinklist(La,Lb); LinkList p=La; p=p->next; while(p){ printf("%d ",p->data); p=p->next; } return 0; } LinkList mergelinklist(LinkList La,LinkList Lb){ LinkList pa,pb; pa=La->next; pb=Lb->next; LinkList last=La; while(pa&&pb){ if(pa->data<pb->data) { LinkList p=pa->next; pa->next=NULL; last->next=pa; last=last->next; pa=p; } else if(pa->data==pb->data){ LinkList p=pa->next; pa->next=NULL; last->next=pa; last=last->next; pa=p; LinkList q=pb; pb=pb->next; free(q); } else{ LinkList p=pb->next; pb->next=NULL; last->next=pb; last=last->next; pb=p; } } last->next=pa?pa:pb; return La; }
LinkList mergelinklist(LinkList La,LinkList Lb){ //已知連結串列La,Lb的元素按遞增排序。 //將兩連結串列合併,仍然使用La的表頭,將兩個表比較,依次將儲存空間連到La上。 //要合併後的連結串列仍然是遞增的,需要尾插法。 LinkList pa,pb; //定義兩個指標又來儲存La,lb從首元結點開始向後的連結串列 pa=La->next; //La連結串列已經賦值給了pa,這樣就可以使用La的頭結點,作為新連結串列的頭結點。 pb=Lb->next; free(Lb); //Lb從首元結點開始已經賦值給了pb,所以把Lb,的頭結點釋放。 LinkList last=La; //last儲存尾結點的地址。 while(pa&&pb){ if(pa->data<pb->data) { LinkList p=pa->next; //先把pa的下一個結點地址儲存下來。 pa->next=NULL; //用尾插法將pa當前結點插入La。 last->next=pa; last=last->next; pa=p; //pa後移一位。 } else if(pa->data==pb->data){ //值相等的情況 LinkList p=pa->next; //將pa當前結點插入La. pa->next=NULL; last->next=pa; last=last->next; pa=p; //pa後移一位 LinkList q=pb; pb=pb->next; //釋放當前結點,並且後移一位 free(q); } else{ LinkList p=pb->next; pb->next=NULL; last->next=pb; last=last->next; pb=p; } } last->next=pa?pa:pb; //pa,pb哪一個連結串列還沒完,就將它連線到La後面。 return La; }