1.题目:
Problem Description
假设有两个由小到大有序的有序顺序表A和B,现要求将表B并入表A中,且A表仍保持由小到大的有序性。若合并后的顺序表表长超过总容量20,则输出“not enough”。
Input
第一行为一个数字n,表示下面有n组数据,每组数据包括4行;每组数据中的第一行表示表A的表长,第二行表示表A的数据元素,第三行表示表B的表长,第四行表示表B的数据元素。
Output
若合并成功,输出两行信息,第一行表示合并后A表的表长,第二行表示合并后A表的数据元素,元素之间用一个空格分隔;若合并后的顺序表表长超过总容量20,则输出“not enough”。
Sample Input
1
4
1 3 8 17
3
6 10 15
Sample Output
7
1 3 6 8 10 15 17
2.参考代码:
代码一:用顺序表
#include <iostream>
using namespace std;
class Seqlist{
private:
int date[50];
int length;
public:
Seqlist(int a[],int n);
~Seqlist(){
}
void insert(int x);
void show();
};
Seqlist::Seqlist(int a[],int n){
for(int i=0;i<n;i++)
date[i]=a[i];
length=n;
}
void Seqlist::insert(int x){
int i=0;
while(i<length && date[i]<=x) ///这里要注意i<length,不然最后一个数字如果相同的话就会出错
i++; ///把x之前的都遍历下
for(int j=length;j>i;j--)
date[j]=date[j-1];
date[i]=x;
length++;
}
void Seqlist::show(){
cout<<length<<endl<<date[0];
for(int i=1;i<length;i++)
cout<<" "<<date[i];
cout<<endl;
}
int main()
{
int i,n,la,lb,a[50],b[50];
cin>>n;
while(n--)
{
cin>>la;
for(i=0;i<la;i++)
cin>>a[i];
cin>>lb;
Seqlist pa(a,la);
int lc=la+lb;
if(lc>20)
{
cout<<"not enough\n";
continue;
}
for(i=0;i<lb;i++)
cin>>b[i];
for(i=0;i<lb;i++)
pa.insert(b[i]);
pa.show();
}
return 0;
}
代码二:用模拟的方法
#include <iostream>
using namespace std;
int a[50],b[50],c[50];
int main()
{
int i,j,n,la,lb;
cin>>n;
while(n--)
{
cin>>la;
for(i=0;i<la;i++)
cin>>a[i];
cin>>lb;
for(i=0;i<lb;i++)
cin>>b[i];
int k=0;
for(i=j=0;i<la && j<lb;) ///注意是两个表同时在范围内
{
if(a[i]==b[j])
{
c[k++]=a[i++];
c[k++]=b[j++];
}
else if(a[i]<b[j])
{
while(i<la && a[i]<b[j])
c[k++]=a[i++];
}
else
{
while(j<lb && a[i]>b[j])
c[k++]=b[j++];
}
}
///当两个表长不一样的时候,就要把比较长的那个表补上来
while(i<la)
c[k++]=a[i++];
while(j<lb)
c[k++]=b[j++];
if(k>20)
{
cout<<"not enough\n";
continue;
}
cout<<k<<endl<<c[0];
for(i=1;i<k;i++)
cout<<" "<<c[i];
cout<<endl;
}
return 0;
}