该题用到了归并排序,正常的归并排序算法是两个数组依次比对元素大小,最后按照要求将比对结果放入新的数组中,但是此题题目中要求将结果放入第一个数组中。
解题思路:可以定义两个指针,分别指向两个数组中的有效元素的最后一个元素,因为要求是非递减数组,所以将两个数组中较大的元素放入第一个数组最后的位置,依次逆序向前比对存放元素。
代码实现:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int sumIndex=m+n-1;//合并后的最后一个元素的索引
int len1=m-1;//定义指针,每个指针指向每个数组的最后一个元素的位置
int len2=n-1;
while(len2>=0 )//表示还有元素要合并到nums1中
{
if( len1>=0 && nums1[len1]>nums2[len2])
{
nums1[sumIndex--]=nums1[len1--];
}
else
{
nums1[sumIndex--]=nums2[len2--];
}
}
}
}