我正在执行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];
}
}
};
易于测试,只需单击上面的链接并复制我的代码,然后提交即可。我希望有人可以帮助我。
答案 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)
运算符只会在以下情况下给您0
:nums1[],m=0,nums2[],n=0
,因为对于所有其他情况,当m=0
但n!=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