题目描述
- 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
暴力法:给了两个数组,我们想把两个数组合并成一个数组后,再对这个数组进行排序,即得到了我们想要的结果。
Cpp实现
class Solution
{public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m;
int j=0;
for(i,j;i<m+n,j<n;i++,j++){
nums1[i] = nums2[j];
}
sort(nums1.begin(),nums1.end());
}
};
Java实现
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int j = 0;
for (int i = m; i < m + n; i++) {
nums1[i] = nums2[j];
j++;
}
Arrays.sort(nums1);
}
双指针解法
- 找到元素插入的位置,对于此位置之后的元素后移一个单位,移动后将元素插入即可
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//双指针
int i = 0;
for(int j = 0;j < n;j++){
//找到nums2中的元素插入到nums1中的位置
while(nums1[i] < num2 && i < m){
i++;
}
int k = m;
//将找到的位置后的元素进行后移
while(k > i){
nums1[k] = nums1[k - 1];
k--;
}
//将元素插入
nums1[i] = nums2[j];
m++;
}
}
}
- 时间复杂度:O(m + n)