LeetCode 88. Merge Sorted Array

📅 发布时间:2026/8/22 1:24:27
LeetCode 88. Merge Sorted Array 题目Given two sorted integer arraysnums1andnums2, mergenums2intonums1as one sorted array.Note:The number of elements initialized innums1andnums2aremandnrespectively.You may assume thatnums1has enough space (size that is greater or equal tomn) to hold additional elements fromnums2.Example:Input:nums1 [1,2,3,0,0,0], m 3 nums2 [2,5,6], n 3Output:[1,2,2,3,5,6]再时隔接近四年回来。确实还是没想到要从后往前。知道以后写代码就非常顺利了除了typo了一下nums1和nums2以外。感觉so easy但是不知道以前为啥想不明白orzclass Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int i m - 1; int j n - 1; int index nums1.length - 1; while (i 0 j 0) { if (nums1[i] nums2[j]) { nums1[index] nums1[i]; i--; } else { nums1[index] nums2[j]; j--; } index--; } while (i 0) { nums1[index] nums1[i]; index--; i--; } while (j 0) { nums1[index] nums2[j]; index--; j--; } } }时隔三年半回来update java解法。刚开始没想到要从后往前想着从前往后一个个挪怎么也不可能O(mn)偷看了一下思路才觉得妙啊。于是就自己写出来了虽然也没有一次bug free并且第一版提交的代码还多了一行没用的if。大概就是两个指针分别指向两个数组的有效末端一个指针指向nums1应该更新的位置两个指针谁大就把谁往后面放。个人觉得用作为结束条件会比较好想清楚一些当任何一个 0以后就停止我们慢慢判断。如果第一个还 0那就说明第二个结束了那第一个本来就是sorted了所以不用管。如果第二个 0那就说明第一个也结束了只需要把第二个剩下的无脑copy到第一个里去就行了。看了答案大部分人都是用的while但是我感觉for更直观。class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int curr1 m - 1; int curr2 n - 1; int index m n - 1; while (curr1 0 curr2 0) { if (nums1[curr1] nums2[curr2]) { nums1[index] nums1[curr1]; curr1--; } else { nums1[index] nums2[curr2]; curr2--; } index--; } for (int i 0; i curr2; i) { nums1[i] nums2[i]; } } }底下以前巨菜的时候写的就真不用看了。这道题需要merge两个数组并且把第二个数组合并到第一个数组中第一个数组的长度是两个数组的长度之和但是有效长度是固定的。刚开始觉得题目很简单直接两个指针分别指向两个数组然后比较谁大谁小nums2的小了就先把nums1后面的数组往后移一位然后把nums2当前这位放到nums1的对应位置。虽然代码写得不是很优雅但我觉得没毛病啊自己运行也是没毛病的但是一提交就runtime error了把这个test case自己run一下也没毛病不太懂class Solution { public: void merge(vectorint nums1, int m, vectorint nums2, int n) { if (nums2.size() 0) return; int i 0, j 0; while (i m) { if (nums1[i] nums2[j]) { for (int k nums1.size() - 1; k i; k--) { nums1[k] nums1[k - 1]; } nums1[i] nums2[j]; j; m; } else { i; } } while (j n) { nums1[i] nums2[j]; i; j; } } };submit以后的结果自己run的结果如果有哪位大佬正好路过看到了的话麻烦帮忙指正一下是什么问题谷歌了一下感觉都跟我这个不太一样……然后看了下discussion里大家的代码整体思路感觉都差不多但是i, j都是从m, n开始往下降的并且设置的k记录的是已经merge好的数组的长度也就是说大家都是从后往前进行合并而非我的做法那样的从前往后。参照大佬们优雅的代码写抄了出来代码如下运行时间0msclass Solution { public: void merge(vectorint nums1, int m, vectorint nums2, int n) { if (nums2.size() 0) return; int i m - 1, j n - 1, k m n - 1; while (i 0 j 0) { if (nums1[i] nums2[j]) { nums1[k--] nums1[i--]; } else { nums1[k--] nums2[j--]; } } while (j 0) { nums1[k--] nums2[j--]; } } };