题目描述
已知线性表LA和LB中的数据元素按值非递减有序排列,现要求LA和LB归并为一个新的线性表LC,且LC中的数据元素仍然按值非递减有序排列。例如,设LA=(3,5,8,11),LB=(2,6,8,9,11,15,20)则LC=(2,3,6,6,8,8,9,11,11,15,20)。
输入
有多组测试数据,每组测试数据占两行。第一行是集合A,第一个整数m(0<=m<=100)代表集合A起始有m个元素,后面有m个非递减排序的整数,代表A中的元素。第二行是集合B,第一个整数n(0<=n<=100)代表集合B起始有n个元素,后面有n个非递减排序的整数,代表B中的元素。每行中整数之间用一个空格隔开。
输出
每组测试数据只要求输出一行,这一行含有m+n个来自集合A和集合B中的元素。结果依旧是非递减的。每个整数间用一个空格隔开。
样例输入
4 3 5 8 11
7 2 6 8 9 11 15 20
样例输出
2 3 5 6 8 8 9 11 11 15 20
代码:
#include<iostream>
#include<cstring>
using namespace std;
int a[110],b[110],c[110];
int i,j,k,n;
int main(){
int m;
int flag=0,len1=0,len2=0;
while(cin>>m){
i=0;
while(m--){
if(flag==0){ //第一行数据放a数组
getchar(); //去空格
cin>>a[i++];
}else{ //第二行数据放b数组
getchar();
cin>>b[i++];
}
}
if(flag==0) len1=i; //保存a长度
else len2=i; //保存b长度
flag=flag+1; //flag 取值0,1,2
if(flag==2 ){ //合并 flag=2,两行数据输完
j=0; k=0;n=0;
while(j<len1 && k<len2) {
while(j<len1){ //a数组移动
if(a[j]<=b[k]) //小的数先存c数组
c[n++]=a[j++];
else break; //大的数退出a数组循环,进行b数组循环前移
}
while(j<len1 && k<len2){ //b数组移动,且a数组未遍历完
if(a[j]>=b[k])
c[n++]=b[k++]; //小的数先存c数组
else break;
}
}
if(j<len1){ //a数组还有剩余数据
while(j<len1) c[n++]=a[j++];
}
if(k<len2){ //b数组还有剩余数据
while(k<len2) c[n++]=b[k++];
}
for(int i=0; i<n;i++){ //打印合并后数组c
cout<<c[i]<<" ";
}
cout<<"\n";
//memset(a,0,sizeof(a));//清零(按长度读取,覆盖的a,b数组,可以不用清零)
// memset(b,0,sizeof(b));
flag=0; //下一个两组数据
}
}
return 0;
}