题目描述
思路解析动画文字版
记住这句「比 nums1 和 nums2 末尾、大的放到 nums1 最后空位」,下面每一帧都在套它。
比较 nums1[5]=11 与 nums2[4]=10 → nums1 末尾更大。准备把较大的放进 nums1 的空位下标 10(指针 k)。
把 11 放进 nums1[10](来自 nums1,i 前移),k 前移到下一个空位。
比较 nums1[4]=9 与 nums2[4]=10 → nums2 末尾更大(或相等取它)。准备把较大的放进 nums1 的空位下标 9(指针 k)。
把 10 放进 nums1[9](来自 nums2,j 前移),k 前移到下一个空位。
比较 nums1[4]=9 与 nums2[3]=8 → nums1 末尾更大。准备把较大的放进 nums1 的空位下标 8(指针 k)。
把 9 放进 nums1[8](来自 nums1,i 前移),k 前移到下一个空位。
比较 nums1[3]=7 与 nums2[3]=8 → nums2 末尾更大(或相等取它)。准备把较大的放进 nums1 的空位下标 7(指针 k)。
把 8 放进 nums1[7](来自 nums2,j 前移),k 前移到下一个空位。
比较 nums1[3]=7 与 nums2[2]=6 → nums1 末尾更大。准备把较大的放进 nums1 的空位下标 6(指针 k)。
把 7 放进 nums1[6](来自 nums1,i 前移),k 前移到下一个空位。
比较 nums1[2]=5 与 nums2[2]=6 → nums2 末尾更大(或相等取它)。准备把较大的放进 nums1 的空位下标 5(指针 k)。
把 6 放进 nums1[5](来自 nums2,j 前移),k 前移到下一个空位。
比较 nums1[2]=5 与 nums2[1]=4 → nums1 末尾更大。准备把较大的放进 nums1 的空位下标 4(指针 k)。
把 5 放进 nums1[4](来自 nums1,i 前移),k 前移到下一个空位。
比较 nums1[1]=3 与 nums2[1]=4 → nums2 末尾更大(或相等取它)。准备把较大的放进 nums1 的空位下标 3(指针 k)。
把 4 放进 nums1[3](来自 nums2,j 前移),k 前移到下一个空位。
比较 nums1[1]=3 与 nums2[0]=2 → nums1 末尾更大。准备把较大的放进 nums1 的空位下标 2(指针 k)。
把 3 放进 nums1[2](来自 nums1,i 前移),k 前移到下一个空位。
比较 nums1[0]=1 与 nums2[0]=2 → nums2 末尾更大(或相等取它)。准备把较大的放进 nums1 的空位下标 1(指针 k)。
把 2 放进 nums1[1](来自 nums2,j 前移),k 前移到下一个空位。
从后往前填了 10 次,nums1 现在整体升序:[1,2,3,4,5,6,7,8,9,10,11]。三个指针各只走一遍,O(m+n)。
边界先想清:n=0 时啥都不用做,m=0 时整段是 nums2。
两个高频追问,区分原地法与开新数组法。
参考代码
def merge(nums1, m, nums2, n): i, j, k = m - 1, n - 1, m + n - 1 while j >= 0: # nums2 还没并完 if i >= 0 and nums1[i] > nums2[j]: nums1[k] = nums1[i]; i -= 1 # nums1 末尾更大 else: nums1[k] = nums2[j]; j -= 1 # 放 nums2 k -= 1复杂度
- 时间:O(m+n),每个元素只被放一次
- 空间:O(1),原地在 nums1 上填,不开新数组
易错点
面试追问把动画讲成自己的话
追问为什么 while 只判 j>=0,不判 i>=0?
追问如果不能原地、允许开新数组怎么写?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
验证回文串
LeetCode 125 · 简单 · 沿着 双指针套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题