class Solution {
public:
void merge(int A[], int m, int B[], int n) {
if(n == 0)
return;
if(m == 0)
{
for(int i = 0; i < n; i++)
{
A[i] = B[i];
}
return;
}
int C[m+n];
int k = 0;
int i = 0;
int j = 0;
while(true)
{
if(A[i] <= B[j])
{
C[k++] = A[i++];
if(i > m - 1)
{
if(j <= n - 1)
{
for(int p = j; p < n; p++)
{
C[k++] = B[p];
}
}
break;
}
}
else
{
C[k++] = B[j++];
if(j > n-1)
{
if(i <= m-1)
{
for(int p = i; p < m; p++)
{
C[k++] = A[p];
}
}
break;
}
}
}
for(int p = 0; p < m + n; p++)
{
A[p] = C[p];
}
return;
}
};
这里使用了额外的数组空间。
方法是循环扫描两数组元素,将较小的放入C的相应位置,当其中一个数组元素扫描完后,
若另外一个数组还有未扫描元素,则将其挂在C的最后。
代码简单,写的很快,但是sub了好几遍不过,看了半天,才发现m和n的含义搞反了,这里mark一下,提醒自己
在写每一行代码时都要集中注意力
另外提供网友的一种做法,不需要使用额外的数组空间,思路是对A数组
从后向前进行填充,充分利用了A数组的额外空间,很简洁,自己还有待提高
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
for (int idx = m + n - 1; idx >= 0; idx--) {
if (m <= 0) {
A[idx] = B[--n];
} else if (n <= 0) {
break;
} else if (A[m-1] < B[n-1]) {
A[idx] = B[--n];
} else {
A[idx] = A[--m];
}
}
}
};