c++arrayssortingmergeundefined-behavior

88. Merge Sorted Array


The task is: here

i've successfuly got working code on local machine, also on platform first three casess attempted my solution. But if i run Submit i've get the undefined behavior runtime error on this case: nums1 = [2,0], m = 1, nums2 = [1], n = 1. As i understand in result must be nums1 = [1,2] and i've get it in local machine without any errors. why that happen?

class Solution {
public:
    void merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n);
};

void Solution::merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n)
{
    int iNums1 = m - 1;
    int iNums2 = n - 1;
    int iResult = m + n - 1;

    for (; iResult >= 0 && iNums2 >= 0; iResult--)
    {
        if (iNums2 < 0)
        {
            break;;
        }
        else if (iNums1 < 0 && iNums2 >= 0)
        {
            std::swap(nums2, nums1);
            break;
        }       
        else if (nums2[iNums2] > nums1[iNums1])
        {
            nums1[iResult] = nums2[iNums2--];
        }
        else if (iResult <= m && nums1[iResult - 1] <= nums2[iNums2] && nums1[iResult] > nums2[iNums2])
        {
            nums1[iResult + 1] = nums1[iResult];
            nums1[iResult] = nums2[iNums2--];
        }
    }
}

used testcase on local machine, no errors occured:

Solution s;
std::vector<int> nums1 = { 2, 0 };
std::vector<int> nums2 = { 1 };
std::vector<int> result = { 1, 2 };
s.merge(nums1, 1, nums2, 1);



Solution

  • Best solution is to use std::merge and merge things in reversed order (note r suffix for iterator functions). This way merge can be done in place without overriding the input data.

    class Solution {
    public:
        void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
            std::merge(
                nums1.rbegin() + nums1.size() - m, nums1.rend(), 
                nums2.rbegin() + nums2.size() - n, nums2.rend(), 
                nums1.rbegin(),
                std::greater<>{});
        }
    };
    

    Live demo