Easy草稿★★★★★O(n + m) 時間 · O(n + m) 空間
Two PointersString
Patterns↔️ 雙指針
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1768Merge Strings AlternatelyTwo PointersEasyTwo Pointers

給定兩個字串 word1word2,交替合併字元。若某字串較長,將剩餘字元接在結果尾端。

Example:

Input: word1 = “abc”, word2 = “pqr” Output: “apbqcr”

Intuition

TIP

核心思路:用一個指針同時遍歷兩個字串,每步輪流加入字元,短的結束後把長的剩餘部分接上。

Approaches

1. Alternate Chars + Append Tail — O(n + m) / O(n + m)
  • Idea: 用一個 index 走到較短字串結束,交替加入字元;再把較長字串剩餘部分接上
  • Time: O(n + m) - n, m 分別為兩字串長度
  • Space: O(n + m) - 結果字串
class Solution {
    fun mergeAlternately(word1: String, word2: String): String {
        val sb = StringBuilder()
        var i = 0
        while (i < word1.length || i < word2.length) {
            if (i < word1.length) sb.append(word1[i])
            if (i < word2.length) sb.append(word2[i])
            i++
        }
        return sb.toString()
    }
}
⭐ 2. Two Pointers (track separately) — O(n + m) / O(n + m)
  • Idea: 分別用兩個指針追蹤兩字串位置,用 boolean 旗標輪流切換
  • Time: O(n + m)
  • Space: O(n + m)
class Solution {
    fun mergeAlternately(word1: String, word2: String): String {
        val sb = StringBuilder()
        var p1 = 0
        var p2 = 0
        while (p1 < word1.length && p2 < word2.length) {
            sb.append(word1[p1++])
            sb.append(word2[p2++])
        }
        while (p1 < word1.length) sb.append(word1[p1++])
        while (p2 < word2.length) sb.append(word2[p2++])
        return sb.toString()
    }
}

WARNING

兩種寫法本質相同,Approach 2 更清楚地分離了「交替區段」與「剩餘區段」。

🔑 Takeaways