题目内容:
已知两个非降序链表序列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<bits/stdc++.h>
using namespace std;
//定义节点类型
typedef struct node{
int data;
struct node *next;
}Node,*link;
//创建链表 (连着输入数据一并完成)
link Create(){
link L=new Node;
link r=L;//表示当前节点
int temp=0;
while(1){
cin>>temp;
if(temp!=-1){
link p=new Node;
p->data=temp;
p->next=NULL;
r->next=p;//链表是有头结点的
r=p;
}
else{
break;
}
}
return L;
}
link Union(link La,link Lb){
link Lc=new Node;
link r=Lc;
link p=La->next;
link q=Lb->next;
while(p&&q){
link s=new Node;
if(p->data<q->data){
s->data=p->data;
p=p->next;
}
else{
s->data=q->data;
q=q->next;
}
r->next=s;
r=s;
}
if(q){
while(q){
link s=new Node;
s->data=q->data;
r->next=s;
r=s;
q=q->next;
}
}
else{
while(p){
link s=new Node;
s->data=p->data;
r->next=s;
r=s;
p=p->next;
}
}
return Lc;
}
int main(){
link La=Create();
link Lb=Create();
link Lc=Union(La,Lb);
link q=Lc->next;
link p=Lb->next;
if(q==NULL){
cout<<"NULL"<<endl;
return 0;
}
int flag=0;
while(q){
if(flag==0){
flag=1;
cout<<q->data;
}
else{
cout<<" "<<q->data;
}
q=q->next;
}
}
需要考虑的测试点:
1 两个链表均为-1(空)
2 第二个链表为空
3 第一个链表完全排在第二个链表后面
4 第二个链表完全排在第一个链表后面
5 含有重复的数字,则重复的数字也要输出