Easy

题目描述

给你两个字符串 word1word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。

返回 合并后的字符串

示例 1:

输入:word1 = "abc", word2 = "pqr"
输出:"apbqcr"
解释:字符串合并情况如下所示:
word1:  a   b   c
word2:    p   q   r
合并后:  a p b q c r

示例 2:

输入:word1 = "ab", word2 = "pqrs"
输出:"apbqrs"
解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。
word1:  a   b 
word2:    p   q   r   s
合并后:  a p b q   r   s

示例 3:

输入:word1 = "abcd", word2 = "pq"
输出:"apbqcd"
解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。
word1:  a   b   c   d
word2:    p   q 
合并后:  a p b q c   d

提示:

  • 1 <= word1.length, word2.length <= 100
  • word1word2 由小写英文字母组成

解题思路

这道题可以使用双指针方法来解决。核心思想是同时遍历两个字符串,交替取字符。

方法一:双指针遍历(推荐) 使用两个指针 ij 分别指向两个字符串的当前位置。在每次迭代中,先添加 word1[i](如果存在),再添加 word2[j](如果存在),然后递增对应的指针。当某个字符串遍历完毕后,将另一个字符串的剩余部分直接追加到结果中。

方法二:统一循环 也可以用一个循环变量同时控制两个字符串的索引,循环条件是两个字符串都没有遍历完。在循环内部检查当前索引是否有效,如果有效就添加对应字符。

两种方法的时间复杂度都是 O(m+n),空间复杂度都是 O(1)(不计算结果字符串的空间)。第一种方法更加直观清晰,推荐使用。

代码实现

class Solution {
public:
    string mergeAlternately(string word1, string word2) {
        string result;
        int i = 0, j = 0;
        
        while (i < word1.length() && j < word2.length()) {
            result += word1[i++];
            result += word2[j++];
        }
        
        // 添加剩余字符
        while (i < word1.length()) {
            result += word1[i++];
        }
        while (j < word2.length()) {
            result += word2[j++];
        }
        
        return result;
    }
};
class Solution:
    def mergeAlternately(self, word1: str, word2: str) -> str:
        result = []
        i = j = 0
        
        while i < len(word1) and j < len(word2):
            result.append(word1[i])
            result.append(word2[j])
            i += 1
            j += 1
        
        # 添加剩余字符
        while i < len(word1):
            result.append(word1[i])
            i += 1
        while j < len(word2):
            result.append(word2[j])
            j += 1
        
        return ''.join(result)
public class Solution {
    public string MergeAlternately(string word1, string word2) {
        StringBuilder result = new StringBuilder();
        int i = 0, j = 0;
        
        while (i < word1.Length && j < word2.Length) {
            result.Append(word1[i++]);
            result.Append(word2[j++]);
        }
        
        // 添加剩余字符
        while (i < word1.Length) {
            result.Append(word1[i++]);
        }
        while (j < word2.Length) {
            result.Append(word2[j++]);
        }
        
        return result.ToString();
    }
}
var mergeAlternately = function(word1, word2) {
    let result = '';
    let i = 0, j = 0;
    
    while (i < word1.length && j < word2.length) {
        result += word1[i++];
        result += word2[j++];
    }
    
    // 添加剩余字符
    while (i < word1.length) {
        result += word1[i++];
    }
    while (j < word2.length) {
        result += word2[j++];
    }
    
    return result;
};

复杂度分析

复杂度分析
时间复杂度O(m + n),其中 m 和 n 分别是 word1 和 word2 的长度
空间复杂度O(1),不计算结果字符串的存储空间

相关题目