题目描述:
给你两个有序整数数组 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]
思路1(暴力解题):
- 直接将nums2数组中的元素拼接到nums1数组中去
- 然后对整个数组进行排序
代码如下:
import java.util.Arrays;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//方法1:(1)直接将nums2数组中的元素插入nums1
for (int i = 0; i < n; i++) {
nums1[m+i] = nums2[i];
}
//(2)排序后对整个数组进行排序
Arrays.sort(nums1);
}
}
思路2(双指针法):
由于题目中给了一个nums1和nums2两个数组都是有序的,所以可以使用双指针法来解题
- 使用变量p1指向nums1的头,使用变量指向nums2的头
- 建立一个临时数组sort用来保存排序后的数组
- 在p1<m||p2<n的条件下循环判断
①如果nums1[p1]==m,直接就让nums2中剩余的数放入sort
②如果nums2[p2]==n,直接就让nums1中剩余的数放入sort
③如果nums1[p1] < nums2[p2],直接就让nums1[p1]放入sort
④如果nums2[p2] < nums1[p1],直接就让nums2[p2]放入sort
⑤最终将sort数组中的元素放回nums1
代码如下:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = 0;
int p2 = 0;
int[] sort = new int[m+n];
int cur;
while(p1 < m || p2 < n){
if (p1 == m){
cur = nums2[p2++];
}else if (p2 == n){
cur = nums1[p1++];
}else if (nums1[p1] < nums2[p2]){
cur = nums1[p1++];
}else {
cur = nums2[p2++];
}
sort[p1+p2-1] = cur;
}
for (int i = 0; i < m+n; i++) {
nums1[i] = sort[i];
}
}
}