1 题目
LeetCode
给定两个有序整数数组,将nums2合并到nums1中,使nums1成为一个有序数组。
nums1和nums2的元素数量分别为 m 和 n,
可以假设num1有足够的空间(空间大小大于或等于m+n)来保存num2中的元素
2 解
维护三个指针,end指向nums1真正的结尾,m指向nums1的结尾,n指向nums2的结尾,当m或n小于0时说明其中一个数组放完了,此时接着放另一个数组。
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(nums2==null||n==0)
//特殊情况,直接返回
return;
//三个指针
int end=m+n-1;
m=m-1;
n=n-1;
while(m>=0 && n>=0){
if(nums1[m]>nums2[n]){
nums1[end]=nums1[m];
end--;
m--;
}else{
nums1[end]=nums2[n];
end--;
n--;
}
}
while(m>=0){
nums1[end]=nums1[m];
end--;
m--;
}
while(n>=0){
nums1[end]=nums2[n];
end--;
n--;
}
}
m是nums1的元素个数,m1不代表nums1null。
要注意m和n和数组的对应关系,细节上不能出错。
方法体中写 int m=m-1会报错,因为m已经在参数处被定义了。