《进军硅谷》原题:合并有序数组
给定两个有序数组A和B, 合并B到A, 结果保持有序。假设A有足够空间容纳B。初始时,A、B元素各有m和n个;
Leetcode: https://leetcode.com/problems/merge-sorted-array/
分析:
数组插入新元素没有链表那么方便,因为插入一个新元素会导致插入后的所有元素的移动,为了避免移动,通常从后向前插入,即反向插入;
思路:
1 找到原有数组A和B的最后一个元素;
2 逐个把较大的值放在A数组的m+n-1位置向前。
3 一定要先画图,再写代码;注意边界条件!
public void Merge(int[] nums1, int m, int[] nums2, int n)
{
//边界条件
if (n == 0) return;
if (m == 0) //返回所有的nums2到nums1中
while (n > 0)
{
nums1[n - 1] = nums2[n - 1];
n--;
}
int i = m - 1;
int j = n - 1;
int k = m + n - 1;
while (i >= 0 || j >= 0)
{
if (i < 0 && j >= 0)
{
nums1[k] = nums2[j];
j--;
}
else if (i >= 0 && j < 0)
{
//do nothing
i--;
}
else
{
if (nums1[i] >= nums2[j])
{
nums1[k] = nums1[i];
i--;
}
else if (nums1[i] < nums2[j])
{
nums1[k] = nums2[j];
j--;
}
}
k--;
}
}