📅  最后修改于: 2023-12-03 14:50:40.016000             🧑  作者: Mango
在编程中,经常会遇到需要合并两个排序列表的情况。合并排序列表即将两个有序列表合并成一个有序列表,并保持有序性。这篇文章将介绍如何使用 C++ 编写一个就地合并两个排序列表的程序。
#include <iostream>
#include <vector>
using namespace std;
// 函数声明
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m - 1;
int j = n - 1;
int k = m + n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] > nums2[j]) {
nums1[k] = nums1[i];
i--;
} else {
nums1[k] = nums2[j];
j--;
}
k--;
}
while (j >= 0) {
nums1[k] = nums2[j];
j--;
k--;
}
}
int main() {
// 示例输入
vector<int> nums1 = {1, 2, 3, 0, 0, 0};
int m = 3;
vector<int> nums2 = {2, 5, 6};
int n = 3;
// 调用函数
merge(nums1, m, nums2, n);
// 输出结果
for (int num : nums1) {
cout << num << " ";
}
cout << endl;
return 0;
}
这个程序使用了一个函数 merge
来合并两个排序列表。函数的参数包括两个分别表示排序列表的向量 nums1
和 nums2
,以及 nums1
和 nums2
中有效元素的个数 m
和 n
。函数会将合并后的结果保存在 nums1
中,并返回最终的排序列表。
整个合并过程采用了双指针的方法。我们定义三个指针 i
、j
和 k
,分别指向 nums1
和 nums2
中当前待比较的元素,以及结果列表 nums1
中的当前空位。从列表的末尾开始比较两个列表中的元素,并将较大的元素放入 nums1
的当前空位,然后向前移动指针。直到其中一个列表中的元素都比较完毕。
如果此时 nums2
中还有剩余元素,我们将它们依次放入 nums1
的空位,合并完成。
最后,我们在 main
函数中使用示例输入调用 merge
函数,并输出最终的合并结果。
这个程序展示了如何使用 C++ 编写就地合并两个排序列表的算法。通过合理运用双指针和向量的特性,我们能够高效地合并两个排序列表,并保持有序性。这是一个常见且实用的算法,在实际编程中经常会遇到。