给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
示例:
输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
说明: A.length == n + m
这道题最简单的思路是直接将数组B与A合并然后再排序,但是过于麻烦切时间复杂度为O(nlogn);
而用指针则可以用O(n)的时间复杂度解决,十分巧妙;思路是:
定义一个lastA指针指向数组A最后一个有效元素,lastB指针指向数组B最后一个元素,tail指针指向数组A的尾部;
1:lastA与lastB比,大的赋值给A[tail],然后大的指针向前移一位,tail向前移一位;
2:如果lastA(或lastB)走完了整个数组变成了-1,则让tail继续向下走,接受没有走完数组lastA(或lastB)的值;所以循环结束条件设为lastA和lastB都走完结束;
代码如下:
void merge(int* A, int ASize, int m, int* B, int BSize, int n)
{
int lastA=m-1,lastB=n-1;
int tail=m+n-1;
int val;
while(lastA>=0||lastB>=0)
{
if(lastA==-1)
val=B[lastB--];
else if(lastB==-1)//我认为这里不需要加这个判断了,因为B数组已经按顺序排进去了,A数组本来就是排好的,不需要再继续了;但是不加力扣没有通过;如果有想法欢迎讨论
val=A[lastA--];
else if(A[lastA]>B[lastB])
val=A[lastA--];
else
val=B[lastB--];
A[tail--]=val;
}
}