给你两个有序整数数组nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组。
说明:
nums1和nums2的有效元素数量分别为m和n;
你可以假设nums1有足够的空间( 空间>=(m+n) )来保存nums2中的元素。
示例:nums1 = [1,2,3,0,0,0] nums2 = [2,5,6]
输出:[1,2,2,3,5,6]
package leetcode.easy;
//import java.util.ArrayList;
import java.util.Arrays;
//import java.util.List;
//88.合并两个有序数组
public class Solution088 {
public static void main(String[] args) {
int[] nums1= new int[6];
for (int i = 0; i < 3; i++) {
nums1[i]=i+1;
}
int[] nums2= {2,5,6};
S088MergeTwoArrays testMergeTwoArrays = new S088MergeTwoArrays();
System.out.println(Arrays.toString(testMergeTwoArrays.mergeArr(nums1, 3, nums2, 3)));
}
}
class S088MergeTwoArrays{
//法1:合并后排序 O((m+n)log(m+n))
//参数要求:nums1= {1,2,3,0,0,0},长度=m+n,多出来的0也会被排序; nums2= {2,5,6}
public int[] mergeTwoArrays(int[] nums1,int m,int[] nums2,int n) {//m n为有效数据长度
System.arraycopy(nums2, 0, nums1, m, n);
//将nums2从下标0开始的数 拷贝到数组nums1,开始的位置是下标m,一共拷贝n个数
Arrays.sort(nums1);
return nums1;
}
//法2:三个指针 两个指针从两数组有数据的的尾部开始遍历,比较后填入nums1的尾部
//参数要求:nums1.length = m+n
public int[] mergeArr(int[] nums1,int m,int[] nums2,int n) {
int index1=m-1;
int index2=n-1;
int index=m+n-1;
while(index1>=0 && index2>=0) {
if (nums1[index1]>nums2[index2]) {
nums1[index]=nums1[index1];
index1--;
}else {
nums1[index]=nums2[index2];
index2--;
}
index--;
//i--: 先计算再-1
// nums1[index--] = nums1[index1]>nums2[index2] ? nums1[index1--] : nums2[index2--];
}
//nums1遍历完,nums2的数据还没拷贝完,直接全部拷贝到nums1的前部
//将nums2从下标0开始的数 拷贝到数组nums1,开始的位置是下标0,一共拷贝(index2+1)个数
System.arraycopy(nums2, 0, nums1, 0, index2+1);
return nums1;
}
/*
//法3:归并排序思想 需要额外空间
//参数要求:int[] nums1= {1,2,3}; int[] nums2= {2,5,6};
//可以先遍历nums1把非0的数全部取出放到新数组中,比较新数组和nums2,结果放入nums1
public List mergeTwoSortedArrays(int[] nums1,int[] nums2) {
List list = new ArrayList();
int i,j;
for ( i=0,j=0; i < nums1.length && j
参考: