题目:

给你两个按 非递减顺序 排列的整数数组 nums1 nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

代码:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        stack<int> st;
        if(m == 0){
             nums1 = nums2;
             return;
        }else if(n==0){
            nums1 = nums1;
            return;
        }else{
            while(!nums1[m-1] || !nums2[n-1]){
                if(nums1[m-1]>=nums2[n-1]){
                    st.push(nums1[m-1]);
                    m--;n--;
                }else if(nums2[n-1]>=nums1[m-1]){
                    st.push(nums2[n-1]);
                    m--;n--;
                }
            }
            
            while(m>0)
                st.push(nums1[m-1]);
            while(n>0)
                st.push(nums2[n-1]);

            for(int j=0;j<(n+m);j++){
                nums1[j]=st.top();
                st.pop();
            }   
        } 
        
    }
};

但是这个超时啦!!!原因应该是新建了一个栈以及很多循环的原因,于是我就开始换思路,想起之前做过类似的题,当时用的是递归来着,于是写了以下代码:

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