leetcode 88. 合并排序数组 c++ 运行时错误

leetcode 88. Merge Sorted Array c++ runtime error

我正在做 leetcode 问题 88。这是 link:Merge Sorted Array

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中作为一个有序数组。 nums1和nums2中初始化的元素个数分别为m和n。您可以假设 nums1 有足够的 space(大于或等于 m + n 的大小)来容纳 nums2.

中的其他元素

我用c++来解决这个问题。但我总是遇到这样的运行时错误:

Runtime Error Message:
Line 922: Char 34: runtime error: reference binding to null pointer of type 'value_type' (stl_vector.h)
Last executed input:
[1]
1
[]
0

这是我的代码:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int output[m+n] = {0};
        int i = 0;
        int j = 0;
        if(sizeof(nums1) == 0)
        {
            for(i = 0; i < n; i++)
            {
                nums1[i] = nums2[i];
            }
            return;
        }
        if(sizeof(nums2) == 0)
        {
            return;
        }
        for(int k = 0; k < m+n; k++)
        {
            if(nums1[i] <= nums2[j])
            {
                if(i < m)
                {
                    output[k] = nums1[i];
                    i++; 
                }
                else if(j < n)
                {
                    output[k] = nums2[j];
                    j++;
                }
            }
            else if(nums1[i] >= nums2[j])
            {
                if(j < n)
                {
                    output[k] = nums2[j];
                    j++;
                }
                else if(i < m)
                {
                    output[k] = nums1[i];
                    i++;
                }
            }
        }
        for(i = 0; i < m+n; i++)
        {
            nums1[i] = output[i];
        }
    }
};

测试很简单,点击上面的link复制我的代码提交即可。我希望有人能帮助我。

当使用 std::vector 时,要检查它是否为空,应使用成员函数 size()sizeof 不是正确的检查。

  if(sizeof(nums1) == 0)

应该是

nums1.size()==0

nums2 向量也是如此。另一件需要注意的事情是 output 数组大小在编译时是未知的,并且通常不支持 VLA,在这里也使用 vector

std::vector<int> output(m+n,0); //Initialized with m+n elements with value 0

您当前的方法存在一些缺陷,例如:

  • sizeof(nums1) 运算符只会在以下情况下给您 0nums1[],m=0,nums2[],n=0,因为对于 m=0n!=0 的所有其他情况], nums1 将包含 0,并且它不会是一个空列表。前任。 nums1[0,0],m=0,nums2[1,2],n=2。要处理此问题,请检查 m==0n==0 而不是使用 sizeof.

  • if(nums1[i] <= nums2[j]),如果j>=n,会抛出分段错误

  • 如果你检查LeetCode上的所有测试用例,你可能会发现更多缺陷。

下面给出正确的做法。这个解决方案在 LeetCode 上被接受。我添加了大部分不言自明的评论。如果您有任何疑问,请随时发表评论。

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int output[m+n] = {0};
        int i = 0;
        int j = 0;
        int k = 0;
        if(m == 0) // nums1 is empty. Ex. nums1[0,0],m=0 and nums2[1,2],n=2
        {
            for(i = 0; i < n; i++)
            {
                nums1[i] = nums2[i];
            }
            return;
        }
        if(n == 0) // nums2 is empty. Ex. nums1[1,2],m=2 and nums2[],n=0
        {
            return;
        }
        for(k = 0; k < m+n; k++)
        {
            if(i>=m || j>=n) // Check if we've exhausted any of nums1 or nums2 list
                break;
            if(nums1[i] <= nums2[j]) // if nums1[i] <= nums2[j]
            {
                output[k] = nums1[i];
                i++;
            }
            else{ // else, nums1[i] > nums2[j]
                output[k] = nums2[j];
                j++;
            }
        }
        while(i<m){ // If some elements are left in nums1. Ex: nums1[4,0,0],m=1 and nums2[1,2],n=2
            output[k] = nums1[i];
            i++;
            k++;
        }
        while(j<n){ // If some elements are left in nums2. Ex: nums1[1,2,0],m=2 and nums2[4],n=1
            output[k] = nums2[j];
            j++;
            k++;
        }
        for(i = 0; i < m+n; i++) // Copy back to nums1
        {
            nums1[i] = output[i];
        }
    }
};