题目:
给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并
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);
}
}
};