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 to hold additional elements from B. The number of elements initialized in A and B are m and n respectively.
You may assume that A has enough space to hold additional elements from B. The number of elements initialized in A and B are m and n respectively.
Analysis:
The classic problem. (can be found in the book "Cracking the Code Interview").
Part of the merge sort, merge the arrays from the back by comparing the elements.
Code(Updated 201309):
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int count=m+n-1;
m--; n--;
while (m>=0 && n>=0){
A[count--] = A[m]>B[n]? A[m--]:B[n--];
}
while (n>=0){ A[count--] = B[n--];}
}
};
Code(Old version):
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int k=m+n-1;
int i=m-1;
int j=n-1;
while (i>=0 && j>=0){
if (A[i]>B[j]){
A[k--]=A[i--];
}else{
A[k--]=B[j--];
}
}
while (j>=0){
A[k--]=B[j--];
}
return;
}
};
Why is the while (m>=0) condition not handled ? How come the smallest elements always are in B ?
ReplyDeleteBecause the remaining elements are already in the array A
Deleteexcellent code.
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteHow about this?
ReplyDeletevoid merge(vector& nums1, int m, vector& nums2, int n) {
if(n == 0 || (n==0 && m==0))
return;
nums1.erase(nums1.begin()+m, nums1.end());
for(int i=0; i<n; i++)
nums1.push_back(nums2[i]);
sort(nums1.begin(), nums1.end());
}