题目描述
思路解析动画文字版
记住「同一个 i,先尝试取 word1[i]、再尝试取 word2[i],越界就跳过」,下面每一帧都在套它。
轮到 word1 的第 0 位字符 "a"。先尝试取 word1[0],它在 word1 长度内,可以取。
"a" 接到结果末尾(第 0 位,绿色)。
轮到 word2 的第 0 位字符 "p"。同一轮里再尝试取 word2[0],它在 word2 长度内,可以取。
"p" 接到结果末尾(第 1 位,绿色)。这一轮 word1、word2 都取过了,进入下一轮。
轮到 word1 的第 1 位字符 "b"。先尝试取 word1[1],它在 word1 长度内,可以取。
"b" 接到结果末尾(第 2 位,绿色)。
轮到 word2 的第 1 位字符 "q"。同一轮里再尝试取 word2[1],它在 word2 长度内,可以取。
"q" 接到结果末尾(第 3 位,绿色)。这一轮 word1、word2 都取过了,进入下一轮。
轮到 word1 的第 2 位字符 "c"。先尝试取 word1[2],它在 word1 长度内,可以取。
"c" 接到结果末尾(第 4 位,绿色)。
轮到 word2 的第 2 位字符 "r"。同一轮里再尝试取 word2[2],它在 word2 长度内,可以取。
"r" 接到结果末尾(第 5 位,绿色)。这一轮 word1、word2 都取过了,进入下一轮。
轮到 word1 的第 3 位字符 "d"。先尝试取 word1[3],它在 word1 长度内,可以取。
"d" 接到结果末尾(第 6 位,绿色)。
注意:i = 3 已经等于 word2 的长度 3,不满足 i < 3,所以 word2 这一支跳过,只剩 word1 在取。从刚接上的 "d" 开始,word1 剩下的字符一个接一个补到末尾,后面还会继续接 "ef"。
轮到 word1 的第 4 位字符 "e"。先尝试取 word1[4],它在 word1 长度内,可以取。
"e" 接到结果末尾(第 7 位,绿色)。
轮到 word1 的第 5 位字符 "f"。先尝试取 word1[5],它在 word1 长度内,可以取。
"f" 接到结果末尾(第 8 位,绿色)。
合并完成,结果是 "apbqcrdef",和开头说的一致。回头看:同一个 i 先取 word1[i]、再取 word2[i],越界就跳过;word2 用完后,word1 的 "def" 自然一路接到末尾。一遍扫完,时间 O(n+m)。
边界(本题约束两串长度都 ≥ 1):单字符短串接完即追加长串剩余;等长则完全交替;长度差很大就交替一段再追加剩余。
两个高频追问:和合并有序序列的区别、双指针写法。
参考代码
class Solution: def mergeAlternately(self, word1: str, word2: str) -> str: ans = [] for i in range(max(len(word1), len(word2))): if i < len(word1): ans.append(word1[i]) if i < len(word2): ans.append(word2[i]) return ''.join(ans)复杂度
- 时间:O(n+m),n、m 是两串长度,每个字符恰好被取一次、接一次
- 空间:O(n+m),结果串本身要装下两串全部字符;Java/C++ 用可变缓冲,不算额外开销
易错点
面试追问把动画讲成自己的话
追问这道题和「合并两个有序数组/链表」有什么异同?
追问能不能用双指针 i、j 分别指 word1、word2 来写?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
最接近的三数之和
LeetCode 16 · 中等 · 沿着 双指针套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题