1768. Merge Strings Alternately

練習日期:2026-01-02

難度:Easy

類型:Two Pointers、String

📘 題目敘述

給定兩個字串 word1word2,請依序從 word1word2 各取一個字元交錯合併成一個新字串。

若其中一個字串較長,則在另一個字串用完後,將剩餘的字元直接接在結果字串後面。

條件限制

  • 1 ≤ word1.length, word2.length ≤ 100
  • word1word2 僅包含小寫英文字母

🧠 解題思路

我的做法是:

  • 每次都從 word1word2 的「最前面」各取一個字元
  • 把這兩個字元依序接到結果字串後面
  • 同時把已經使用過的字元從原字串中移除
  • 重複這個過程,直到其中一個字串用完
  • 最後再把剩下的字串整段接到結果後面

所有變數(對應程式碼)

  • word:最後要回傳的合併結果字串
  • word1:尚未被合併的第一個字串
  • word2:尚未被合併的第二個字串
  • l1:目前 word1 剩餘的字元數
  • l2:目前 word2 剩餘的字元數

while (l1 != 0 && l2 != 0):兩個字串都還有字元時

這個迴圈代表:

  • 只要 word1word2 都還沒用完
  • 就可以繼續「交錯」從兩邊各取一個字元

第一步:各取一個字元接到結果後面

word = word + word1[0] + word2[0];

這一行做的事情是:

  • 先取出 word1 的第一個字元 word1[0]
  • 再取出 word2 的第一個字元 word2[0]
  • 依照順序把這兩個字元接到結果字串 word 後面

這正好對應題目要求的「交錯合併」。


第二步:移除已經使用過的字元

word1 = word1.erase(0, 1);
word2 = word2.erase(0, 1);

這兩行的作用是:

  • 把 word1 與 word2 各自已經使用過的第一個字元刪掉
  • 讓下一輪迴圈時,新的第一個字元就是「尚未使用」的部分

第三步:更新剩餘長度

l1 = l1 - 1;
l2 = l2 - 1;

每次取走一個字元,就同步更新剩餘長度,確保 while 條件能正確判斷是否還能繼續交錯合併。


while 結束後:其中一個字串已經用完

當 while 迴圈結束時,代表:

  • word1 或 word2 至少有一個已經沒有剩餘字元
  • 但另一個字串可能還有尚未合併的部分

將剩餘字串直接接到結果後面:

word = word + word1;
word = word + word2;

若 word1 已經是空字串,這一行不會有任何影響;若 word2 已經是空字串,同樣不影響結果。

最後回傳結果,回傳已經完成交錯合併的字串。

💻 程式碼實作

class Solution {
public:
    string mergeAlternately(string word1, string word2) {
        string word = "";
        int l1 = word1.size(), l2 = word2.size();
        while (l1 != 0 && l2 != 0) {
            word = word + word1[0] + word2[0];
            word1 = word1.erase(0, 1);
            word2 = word2.erase(0, 1);
            l1 = l1 - 1;
            l2 = l2 - 1;
        }
        word = word + word1;
        word = word + word2;
        return word;
    }
};

https://leetcode.com/problems/merge-strings-alternately/

作者: scottnick
撰寫日期: 2026-01-02
類別:
原文連結: https://scottnick.github.io/cpp-notes/leetcode75/1768-merge-strings-alternately.html