题目链接:Merge Sorted Array
题意很简单,合并两个已经排序数组,但是将nums2添加到nums1中。
之前也做过类似的题,不过之前合并的是列表,这道题是数组。
如果只是简单的合并两个已经排序的数组的话,其实可以使用相同的方法,依次循环两个数组,将小的加入到新增的数组中,但是这道题不能使用新的内存空间。
设置指针依次指向nums1中的值和nums2中值的进行比较,如果为nums2的值>=nums1中的值,即正确的插入位置,则将nums1剩余数值向后移动,将nums2的值插入,但是这样移动显然效率不高,因此可以采用尾插法。
因为nums1的长度为m+n,所以先比较nums1[m-1]和nums2[n-1]的值,将大的赋给nums1[n+m-1],依次类推,这样避免了移动nums1中的值
代码:
public class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(m==0){
for(int i=0;i<n;i++)
nums1[i]=nums2[i];
return;
}
while(n>0&&m>0)
{
if(nums1[m-1]>nums2[n-1])
{
nums1[n+m-1] = nums1[m-1];
m--;
}
else
{
nums1[n+m-1] = nums2[n-1];
n--;
}
}
//如果最后nums2有多余的数值,则直接将其赋值给nums1的前n位。
if(m==0)
for(int i=0;i<n;i++)
nums1[i] = nums2[i];
}
}