没问题!咱们完全不搞复杂的名词,把这道题当成“排队接力”的游戏来理解。
你可以把 word1 看作队A,把 word2 看作队B。
题目要求:队A出一个人,队B出一个人,交替排进新队伍里。
第一步:图解核心逻辑(以 word1 = "abc", word2 = "pqr" 为例)
我们需要两个“指针”(可以想象成指着队员的手指):
手指
i指着队A(word1)当前轮到谁。手指
j指着队B(word2)当前轮到谁。
一开始,两个手指都指着第 0 个位置:
第二步:带防呆设计的代码拆解
我们再来看看完整代码,这回每一段我都给你配上“大白话”翻译:
Python
class Solution:
def mergeAlternately(self, word1: str, word2: str) -> str:
# 1. 准备一个空盒子 res,专门用来装拼接好的字符
res = []
# 2. 算一下两个队伍分别有多少人
m = len(word1) # 队A的总人数
n = len(word2) # 队B的总人数
# 3. 两个手指一开始都指向队伍的最前面(索引 0)
i = 0
j = 0
# 4. 【核心循环】只要“队A还有人”并且“队B也还有人”,就继续交替领人
# i < m 代表队A还没领完;j < n 代表队B也没领完
while i < m and j < n:
res.append(word1[i]) # 队A出一个人,装进盒子
res.append(word2[j]) # 队B出一个人,装进盒子
i = i + 1 # 队A的手指往后挪一位(简写为 i += 1)
j = j + 1 # 队B的手指往后挪一位(简写为 j += 1)
# 5. 【扫尾工作】当上面的 while 循环结束时,说明至少有一个队伍领完了。
# 如果某个队伍比较长,剩下的直接整串扔进盒子末尾。
# 在 Python 里,word1[i:] 的意思就是:从位置 i 开始,一直取到末尾。
# 如果队A已经领完了(i == m),word1[m:] 就是空的,不会影响结果。
res.append(word1[i:])
res.append(word2[j:])
# 6. 把盒子里的字符用 ""(空字符)连成一个完整的字符串返回
# 例如 ['a', 'p', 'b'] 会变成 "apb"
return "".join(res)
第三步:初学者最容易卡住的 3 个疑问
疑问 1:为什么用
res = []装字符,而不是直接用字符串加(res = ""然后res += ...)?
解答:在 Python 中,字符串是不可变的。每次做
字符串 + 字符串,计算机都要在内存里重新盖一座“新房子”,非常浪费时间;而往列表([])里加东西,就像往背包里塞东西一样快。
疑问 2:
while i < m and j < n是什么意思?
解答:
and代表“同时成立”。这句话的意思是:“只有在两个队伍都还有人的时候,我才一对一对地拿”。只要有任意一队拿光了,这个循环就立刻停止。
疑问 3:
word1[i:]如果没剩下东西会发生什么?
解答:假设
word1 = "ab"(长度为2),当 时,word1[2:]取出来的是空字符串""。列表加了一个空字符串,最后用" ".join(...)拼起来时完全没有影响,非常安全!