题目
给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
一、代码实现
go
func mergeAlternately(word1 string, word2 string) string {
var buffer bytes.Buffer
i, j := 0, 0
len1, len2 := len(word1), len(word2)
// 交替添加字符
for i < len1 && j < len2 {
buffer.WriteByte(word1[i])
buffer.WriteByte(word2[j])
i++
j++
}
// 追加剩余部分(直接拼接剩余子串)
buffer.WriteString(word1[i:])
buffer.WriteString(word2[j:])
return buffer.String()
}
二、算法分析
- 核心思路
• 双指针交替遍历 :用指针 i
和 j
分别遍历 word1
和 word2
,交替将字符添加到结果中,直到其中一个字符串遍历完。
• 剩余字符追加:若某字符串未遍历完,直接将其剩余部分追加到结果末尾。
-
关键步骤
-
初始化缓冲区 :使用
bytes.Buffer
高效拼接字符串(类似 Java 的StringBuilder
)。 -
交替合并 :循环中依次添加
word1
和word2
的字符。 -
处理剩余字符 :通过
word1[i:]
和word2[j:]
直接截取剩余子串追加。 -
复杂度
• 时间复杂度 :O(max(m, n))
,其中 m
和 n
为两字符串长度。交替合并部分为 O(min(m, n))
,剩余部分为 O(|m-n|)
。
• 空间复杂度 :O(m + n)
,存储合并后的字符串。
三、算法图解(SVG)

图解说明:
- 双指针
i
和j
分别从word1
和word2
的起始位置开始。 - 每次循环依次将
word1[i]
和word2[j]
添加到结果中。 - 遍历完成后,将剩余字符直接拼接。
四、边界条件与测试用例
测试用例 | 预期输出 | 说明 |
---|---|---|
word1="ab", word2="pqrs" |
"apbqrs" |
word2 较长,剩余字符追加 |
word1="", word2="xyz" |
"xyz" |
word1 为空字符串 |
word1="a", word2="" |
"a" |
word2 为空字符串 |
五、扩展思考
- 多字符串交替合并:若需合并多个字符串(如三个),可通过循环队列管理指针。
- 内存优化 :预计算结果长度并预分配内存(如
make([]byte, 0, len1+len2)
),减少动态扩容开销。 - 并发处理:若字符串极大,可将交替合并和剩余追加拆分为并行任务(需处理竞态条件)。