7-51 两个有序链表序列的合并
分数 20
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
代码长度限制
16 KB
时间限制
1500 ms
内存限制
128 MB
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}node,*link;
int main(){
link s1=(link)malloc(sizeof(node));
link s2=(link)malloc(sizeof(node));
s1->next=NULL;
s2->next=NULL;
link r1=(link)malloc(sizeof(node));
link r2=(link)malloc(sizeof(node));
r1=s1;
r2=s2;
int n1,n2;
scanf("%d",&n1);
while(n1!=-1){
link t=(link)malloc(sizeof(node));
t->data=n1;
t->next=NULL;
r1->next=t;
r1=t;
scanf("%d",&n1);
}
scanf("%d",&n2);
while(n2!=-1){
link t=(link)malloc(sizeof(node));
t->data=n2;
t->next=NULL;
r2->next=t;
r2=t;
scanf("%d",&n2);
}
// s1=s1->next;
// while(s1!=NULL){
// printf("%d ",s1->data);
// s1=s1->next;
// }
// printf("\n");
// s2=s2->next;
// while(s2!=NULL){
// printf("%d ",s2->data);
// s2=s2->next;
// }
r1=s1->next;
r2=s2->next;
link ans=(link)malloc(sizeof(node));
ans->next=NULL;
link ra=(link)malloc(sizeof(node));//ans的尾巴结点
ra=ans;
while(r1!=NULL && r2!=NULL){
if(r1->data < r2->data ) { //小的先放进去
//printf("1:%d %d\n",r1->data,r2->data);
link tem=(link)malloc(sizeof(node));
tem->data = r1->data;
tem->next=NULL;
ra->next=tem;
ra=tem;
r1=r1->next;
}
else if(r1->data >= r2->data){
//printf("2:%d %d\n",r1->data,r2->data);
link tem=(link)malloc(sizeof(node));
tem->data = r2->data;
tem->next=NULL;
ra->next=tem;
ra=tem;
r2=r2->next;
}
}
if(r1!=NULL){
ra->next=r1;
}
if(r2!=NULL){
ra->next=r2;
}
ans=ans->next;
if(ans==NULL){
printf("NULL");
}
else{
while(ans->next!=NULL){
printf("%d ",ans->data);
ans=ans->next;
}
printf("%d",ans->data);
}
}