time_limit |
3000MS |
memory_limit |
10000KB |
description |
假設兩個按元素值非遞減有序排列的線性表A和B,均以單鏈表作爲存儲結構,試編寫程序,將A表和B表歸併成一個按元素值非遞增有序排列的線性表C,並要求利用原表(即A表和B表的)結點空間存放表C。 |
input |
第一行輸入兩個正整數m,n(m,n<=100),用空格分開,表示線性表A和B中元素個數,其後兩行分別輸入單鏈表A和B。 |
output |
輸出單鏈表C。 |
sample_input |
5 5 1 3 7 12 16 2 6 7 13 20 |
sample_output |
20 16 13 12 7 7 6 3 2 1 |
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Node{
ElemType a;
struct Node *next;
}LNode,*Linklist;
Linklist listInit(int n)
{
Linklist head,p,q;
int i;
head=(LNode *)malloc(sizeof(LNode));
p=head;
for(i=0;i<n;i++){
q=(LNode *)malloc(sizeof(LNode));
scanf("%d",&q->a);
p->next=q;
p=q;
}
q->next=NULL;
return head;
}
void listdaozhi(Linklist head)
{
int tdata;
Linklist p ,q ,t;
p=head->next;
if(!p)return;
q=p->next;
if(!q)return;
t=q->next;
if(!t){
tdata=p->a;
p->a=q->a;
q->a=tdata;
return;
}
p->next=NULL;
while(t!=NULL){
q->next=p;
head->next=q;
p=q;
q=t;
t=t->next;
}
head->next=q;
q->next=p;
}
void mergeList(Linklist la,Linklist lb,Linklist* lc)
{ //由於定義鏈表時不夠完善,導致要用二維指針
Linklist pa,pb,pc,head;
head=pc=la;
pa=la->next;
pb=lb->next;
while(pa&&pb){
if(pa->a>pb->a){
pc->next=pa;
pc=pc->next;
pa=pa->next;
}
else{
pc->next=pb;
pc=pc->next;
pb=pb->next;
}
}
if(pa) pc->next=pa;
else pc->next=pb;
*lc=head;
}
void listshow(Linklist head)
{
int i=0;
Linklist p;
p=head->next;
while(p!=NULL){
if(i!=0)printf(" ");
printf("%d",p->a);
p=p->next;
i++;
}
printf("\n");
}
int main()
{
Linklist la,lb;
Linklist *lc;
int n,m;
scanf("%d%d",&m,&n);
la=listInit(m);
lb=listInit(n);
listdaozhi(la);
listdaozhi(lb);
lc=(Linklist *)malloc(sizeof(LNode));
mergeList(la,lb,lc);
listshow(*lc);
return 0;
}