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;
}