题目:将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
(1)算法思想:
## 利用双指针技术,同时遍历两个数组A,B,通过比较A,B两个数组当前指针所指向的元素大小,将较小的元素复制到结果数组C中,并移动对应的指针。
这个过程一直持续到至少有一个数组的所有元素都被复制到结果数组中。之后,将剩余数组中的元素直接复制到结果数组的末尾。
(2)算法步骤:
①数组长度比较:首先保证A的数组长度 + B的数组长度 > C的数组长度
②初始化指针:设置两个指针i,j分别指向A,B两个数组的起始位置,同时设置一个指针k指向结果数组C的起始位置。
③比较元素:比较A[i]和B[j]的值,将较小的元素复制到C[k++],并将对应的指针向前移动一位。
④遍历结束:当其中一个数组的所有元素都被复制到结果数组后,另一个数组可能还有剩余元素。
⑤复制剩余元素:如果A还有剩余元素,将它们直接复制到C的剩余位置;如果B还有剩余元素,同样操作。
⑥返回结果长度:完成上述步骤后,返回指针k的值,表示结果数组的有效长度。
bool mergeSortedArrays(seqList A, seqList B, seqList &C){
if(A.length + B.length > C.maxLength) { // 首先保证A的长度 + B的长度 > C的长度
return false;
}
int i = 0, j = 0, k = 0;
while (i < A.length && j < B.length) {
if (A.data[i] < B.data[j]) {
C.data[k++] = A.data[i];
} else {
C.data[k] = B.data[j];
}
}
while (i < A.length) { // 若A中有剩余元素
C.data[k++] = A.data[i++];
}
while(j < B.length) { // 若B中有剩余元素
C.data[k++] = B.data[j++];
}
C.length = k;
return ;
}