题目:我们已经实现了合并两个有序链表,请试着将有序顺序表A和有序顺序表B合成一个新的有序顺序表 C。
解题思路:新建顺序表,两个数组合并到新建的顺序表。
bool Merge(SeqList& A, SeqList& B, SeqList& C){
if(A.length + B.length > maxSize) return false; //顺序表C无法容纳
//两两比较,小者入C
int i = 0, j = 0, k = 0;
while(i < A.length && j < B.length){
if(A.elem[ i] <= B.elem[j]) C.elem[k ++] = A.elem[ i ++];
else C.elem[k ++] = B.elem[j ++];
}
//将二者没有比完的部分直接插到顺序表C后面
while(i < A.length) C.elem[k ++] = A.elem[ i ++];
while(j < B.length) C.elem[k ++]= B.elem[j ++];
C.length = k; //给c的长度赋值
return true;
}
完整代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxSize 100
typedef struct {
int elem[maxSize];
int length;
}SeqList;
bool Merge(SeqList& A, SeqList& B, SeqList& C){
if(A.length + B.length > maxSize) return false; //顺序表C无法容纳
//两两比较,小者入C
int i = 0, j = 0, k = 0;
while(i < A.length && j < B.length){
if(A.elem[ i] <= B.elem[j]) C.elem[k ++] = A.elem[ i ++];
else C.elem[k ++] = B.elem[j ++];
}
//将二者没有比完的部分直接插到顺序表C后面
while(i < A.length) C.elem[k ++] = A.elem[ i ++];
while(j < B.length) C.elem[k ++]= B.elem[j ++];
C.length = k; //给c的长度赋值
return true;
}
int main(){
SeqList A;
cin >> A.length;
for(int i = 0; i < A.length; i ++) cin >> A.elem[i];
SeqList B;
cin >> B.length;
for(int i = 0; i < B.length; i ++) cin >> B.elem[i];
SeqList C;
Merge(A, B, C);
cout<<"合并后的顺序表:"<<endl;
for(int i = 0; i < C.length; i ++) cout<<C.elem[i]<<" ";
}
运行结果:
更多代码请参考:手撕考研数据结构(代码汇总)