问题:
Given two sorted integer arrays A and B, merge B into A as one sorted array.
Note:
You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are mand n respectively.
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
if(m==0)
{
for(int i = 0; i < n; i++)
A[i] = B[i];
return;
}
if(n == 0)
{
return;
}
int indexA = 0;
int indexB = 0;
int *C = new int[m+n];
int count = 0;
while(indexA < m && indexB < n)
{
if(A[indexA] < B[indexB])
{
C[count] = A[indexA];
indexA++;
count++;
}
else{
C[count] = B[indexB];
indexB++;
count++;
}
}
if(indexA < m)
{
for(int i = indexA; i < m; i++)
{
C[count] = A[i];
count++;
}
}
if(indexB < n)
{
for(int i = indexB; i < n; i++)
{
C[count] = B[i];
count++;
}
}
for(int i = 0; i < count; i++)
A[i] = C[i];
}
};
后来,发现其实可以逆向思维,指针从数组后面往前递减,每次得到最大的数放入A末尾。这样不需要额外的空间存储。
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
if(m==0)
{
for(int i = 0; i < n; i++)
A[i] = B[i];
return;
}
if(n == 0)
{
return;
}
int indexA = m - 1;
int indexB = n - 1;
int count = m + n - 1;
while(indexA > -1 && indexB > -1)
{
if(A[indexA] > B[indexB]){
A[count] = A[indexA];
count--;
indexA--;
}
else{
A[count] = B[indexB];
count--;
indexB--;
}
}
if(indexB > -1){
for(int i = indexB; i >= 0;i--)
{
A[count] = B[i];
count--;
}
}
}
};