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 m and n respectively.
Naive Way:It seems to be another typical two pointers question. However, it is not good for us to keep replace on array A. It may overlap unused elements. Notice that A has at least n space in the backward that hasn't been used yet. Can we do two pointers trick start from the end? Will that cause overlapping on unused element, too?
Yes, we can. Consider the worst case, all elements in B are greater than all elements in A. We need to first put all elements in B into A. Will that overlap unused elements in A? No, because there are at least n space, which can hold all elements in B neatly.
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int index = n+m-1;
int p1 = m-1, p2 = n-1;
while(p1 >= 0 && p2 >= 0){
if(A[p1] < B[p2])
A[index--] = B[p2--];
else
A[index--] = A[p1--];
}
while(p1 >= 0) A[index--] = A[p1--];
while(p2 >= 0) A[index--] = B[p2--];
}
}
No comments:
Post a Comment