leetcode88。合并排序数组c ++运行时错误

时间:2019-12-24 04:39:13

标签: c++ mergesort

我正在执行leetcode问题88。这是链接:Merge Sorted Array

给出两个排序的整数数组nums1和nums2,将nums2合并为nums1作为一个排序的数组。在nums1和nums2中初始化的元素数分别为m和n。您可能会认为nums1有足够的空间(大小大于或等于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];
        }
    }
};

易于测试,只需单击上面的链接并复制我的代码,然后提交即可。我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:0)

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

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

  • sizeof行中,如果if(nums1[i] <= nums2[j]),则会引发细分错误。

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

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

j>=n