波波老师您好,关于leetcode88题,合并2个数组,他题目的要求是可以假设nums1的空间是>=nums1+nums2的,但是我当时做的时候,是按照nums1的空间=nums1+nums2的,然后AC了,代码如下,我使用从后往前遍历的:
public class Solution1 {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int l=m-1;
int r=n-1;
for(int i=m+n-1;i>=0;i--) {
if(l<0) {
nums1[i]=nums2[r];r--;
}
else if(r<0) {
nums1[i]=nums1[l];l--;
}
else if(nums1[l]<=nums2[r]) {
nums1[i]=nums2[r];r--;
}
else{
nums1[i]=nums1[l];l--;
}
}
}
}
我不知道这个行不行,到底需要不需要考虑nums1的空间大于2个数组空间之和的情况。
下面是官方给的题解:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// two get pointers for nums1 and nums2
int p1 = m - 1;
int p2 = n - 1;
// set pointer for nums1
int p = m + n - 1;
// while there are still elements to compare
while ((p1 >= 0) && (p2 >= 0))
// compare two elements from nums1 and nums2
// and add the largest one in nums1
nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--];
// add missing elements from nums2
System.arraycopy(nums2, 0, nums1, 0, p2 + 1);//这里有些不懂
}
}
最后一行代码有些不理解,这个难道没有忽略当nums2提前遍历完(已经在nums1中填充并排好序,但是nums1此时指针还未到0)之后,需要将nums1自己本身复制到nums1的原来的地方吗?按照我的理解就是,无论是nums1还是nums2有没有遍历完,最后都是将nums2没有遍历完的地方复制到nums1里面?这样是不是错了?