[leetcode] Merge Sorted Array

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:

  • The number of elements initialized in nums1 and nums2 are m and n respectively.
  • You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.

Example:

Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

Output: [1,2,2,3,5,6]

 分析:这个题目理解起来比较容易,就是给两个有序的数组,要求将他们合并成一个有序的数组。有意思的是这个题目要求在nums1这个数组的基础上进行合并。如果没有这个要求,当然很容易了,另开一个数组,然后用两个指针比较头节点的大小,add到新的数组里。
但是因为要求在nums1中完成,所以依然依靠双指针的思想。
第一个想法是两个指针从头到尾遍历,然后nums1每个位置元素向后挪的这种思想,结果发现不行,没有办法处理例子所示的5和6两种情况。因为0既可能是数字出现,也可能是作为补位出现。
第二个想法:从两个指针都从后往前,因为数组开的足够大,所以可以直接使用替换的方法来做。非常巧妙的思路。
代码如下:
 1 class Solution {
 2    public void merge(int[] nums1, int m, int[] nums2, int n) {
 3         int i = m - 1;
 4         int j = n - 1;
 5         int k = m + n - 1;
 6         while ( i >= 0 && j >= 0 ){
 7             if ( nums1[i] >= nums2[j] )
 8                 nums1[k--] = nums1[i--];
 9             else
10                 nums1[k--] = nums2[j--];
11         }
12         while ( j >= 0 ){
13             nums1[k--] = nums2[j--];
14         }
15     }
16 }

运行时间3ms。

总结:找到实习之后有一个月没有刷题了,被师兄一语点醒梦中人。还是要不停的充实自己。以后保证每天至少刷一个题,即使在上班时也要抽空刷题!加油!

原文地址:https://www.cnblogs.com/boris1221/p/9575853.html