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());
}