2021-03-31 LeetCode刷题 88.合并两个有序数组??
题目描述
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
我的代码,有错误,但是发现不了错误,有老铁帮忙看看吗?
思想就是:双指针,一个指向nums1_copy,一个指向nums2从左到右,比较两个值的大小,小的就先放在nums1里面
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums1_copy=nums1;
int i=0,j=0,index=0;
while(index<m+n){
if(i<m&&j<n){
if(nums1_copy[i]<=nums2[j])
{
nums1[index++]=nums1_copy[i++];
}else{
nums1[index++]=nums2[j++];
}
}else if(i==m){
nums1[index++]=nums2[j++];
}else{
nums1[index++]=nums1_copy[i++];
}
}
for(int k=0;k<m+n;k++){
System.out.println(nums1[k]);
}
}
}
力扣题解1,和我想得差不多
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// Make a copy of nums1.
int [] nums1_copy = new int[m];
System.arraycopy(nums1, 0, nums1_copy, 0, m);
// Two get pointers for nums1_copy and nums2.
int p1 = 0;
int p2 = 0;
// Set pointer for nums1
int p = 0;
// Compare elements from nums1_copy and nums2
// and add the smallest one into nums1.
while ((p1 < m) && (p2 < n))
nums1[p++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++];
// if there are still elements to add
if (p1 < m)
System.arraycopy(nums1_copy, p1, nums1, p1 + p2, m + n - p1 - p2);
if (p2 < n)
System.arraycopy(nums2, p2, nums1, p1 + p2, m + n - p1 - p2);
}
}
力扣题解2:指针从右至左,不需要复制一个nums1
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);
}
}