My code:
public class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if (nums1 == null || nums1.length == 0)
return;
if (nums2 == null || nums2.length == 0)
return;
if (m == 0 && n != 0) {
for (int j = 0; j < n; j++)
nums1[j] = nums2[j];
return;
}
else if (m != 0 && n == 0)
return;
else if (m == 0 && n == 0)
return;
int s1 = 0;
int s2 = 0;
while (s1 < m && s2 < n) {
if (nums1[s1] <= nums2[s2]) {
s1++;
}
else {
for (int j = m; j > s1; j--)
nums1[j] = nums1[j - 1];
nums1[s1++] = nums2[s2++];
m++;
}
}
if (s1 >= m) {
for (int j = s2; j < n; j++)
nums1[s1++] = nums2[j];
}
}
public static void main (String[] args) {
Solution test = new Solution();
int[] nums1 = {1, 0};
int[] nums2 = {2};
test.merge(nums1, 1, nums2, 1);
}
}
My test result:
這次題目比較簡單午笛。但還是有些細節(jié)需要考慮到悲幅,即 m 是需要變的捕虽,不是定值。
當 nums1[s1] <= nums2[s2] 時诫肠, s1++,然后繼續(xù)比較司澎。
如果 .... > .... 時,就需要將s1之后的數(shù)組元素都整體向后移動一格栋豫,并且s2++,同時挤安,一定會遺漏的一點是,m++,這樣才能保證數(shù)組動態(tài)性丧鸯,并且與邏輯一致蛤铜。
這道題目提示是 two pointers, but I think it should be "three pointers"
**
總結(jié): Array, three pointers
**
Anyway, Good luck, Richardo!
My code:
public class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0)
return;
if (m < 0 || n < 0)
return;
int[] sortedArr = new int[m + n];
int i = 0; // index of nums1
int j = 0; // index of nums2
for (int k = 0; k < m + n; k++) {
if (i >= m)
sortedArr[k] = nums2[j++];
else if (j >= n)
sortedArr[k] = nums1[i++];
else if (nums1[i] < nums2[j])
sortedArr[k] = nums1[i++];
else
sortedArr[k] = nums2[j++];
}
for (i = 0; i < m + n; i++)
nums1[i] = sortedArr[i];
}
}
用一個循環(huán)就可以把問題解決,不需要再分類討論了骡送。
Anyway, Good luck, Richardo!
My code:
public class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1;
int j = n - 1;
int k = m + n - 1;
while (i >= 0 || j >= 0) {
if (i < 0) {
nums1[k--] = nums2[j--];
}
else if (j < 0) {
nums1[k--] = nums1[i--];
}
else if (nums1[i] > nums2[j]) {
nums1[k--] = nums1[i--];
}
else {
nums1[k--] = nums2[j--];
}
}
}
}
reference:
https://discuss.leetcode.com/topic/2461/this-is-my-ac-code-may-help-you/2
可以不用申請額外內(nèi)存昂羡。從后往前掃描。
Anyway, Good luck, Richardo! -- 09/25/2016