📜  合并两个排序列表的 C++ 程序(就地)(1)

📅  最后修改于: 2023-12-03 14:50:40.016000             🧑  作者: Mango

合并两个排序列表的 C++ 程序(就地)

简介

在编程中,经常会遇到需要合并两个排序列表的情况。合并排序列表即将两个有序列表合并成一个有序列表,并保持有序性。这篇文章将介绍如何使用 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 来合并两个排序列表。函数的参数包括两个分别表示排序列表的向量 nums1nums2,以及 nums1nums2 中有效元素的个数 mn。函数会将合并后的结果保存在 nums1 中,并返回最终的排序列表。

整个合并过程采用了双指针的方法。我们定义三个指针 ijk,分别指向 nums1nums2 中当前待比较的元素,以及结果列表 nums1 中的当前空位。从列表的末尾开始比较两个列表中的元素,并将较大的元素放入 nums1 的当前空位,然后向前移动指针。直到其中一个列表中的元素都比较完毕。

如果此时 nums2 中还有剩余元素,我们将它们依次放入 nums1 的空位,合并完成。

最后,我们在 main 函数中使用示例输入调用 merge 函数,并输出最终的合并结果。

结论

这个程序展示了如何使用 C++ 编写就地合并两个排序列表的算法。通过合理运用双指针和向量的特性,我们能够高效地合并两个排序列表,并保持有序性。这是一个常见且实用的算法,在实际编程中经常会遇到。