// 演算法：雙指針從後往前合併。i 指 nums1 尾端、j 指 nums2 尾端、k 為寫入位置。
// Algorithm: two-pointer merge from the back. i walks nums1's real tail, j walks
// nums2's tail, k is the write slot. Each step places max(nums1[i], nums2[j]) at k.
// 時間 O(m+n)，空間 O(1)。 / O(m+n) time, O(1) space.

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    // nums1Size / nums2Size 參數用不到；LeetCode 的 C 介面硬性要求帶上陣列長度。
    // nums1Size / nums2Size are unused; LeetCode's C signature mandates passing lengths.
    (void)nums1Size;  // 抑制未使用參數的編譯警告 / silence "unused parameter" warnings
    (void)nums2Size;  // 同上 / same as above

    int i = m - 1;         // i 指向 nums1 目前最後一個真實元素 / index of last real nums1 element
    int j = n - 1;         // j 指向 nums2 目前最後一個元素 / index of last nums2 element
    int k = m + n - 1;     // k 指向 nums1 的最後一格（寫入位置）/ write position at tail of nums1

    // 只要 nums2 還有元素就要繼續合併；nums1 側若先用完由下方補抄處理。
    // Loop while nums2 still has elements; leftover nums1 prefix needs no action
    // because it is already sorted and sits in its final place.
    while (j >= 0) {
        // 若 nums1 真實元素已耗盡，直接把剩下的 nums2 複製過去。
        // If nums1's real elements are exhausted, just drain nums2 into the front.
        if (i < 0) {
            nums1[k] = nums2[j];  // 把 nums2[j] 寫入 nums1[k] / copy nums2[j] into slot k
            j--;                  // nums2 指針左移 / move nums2 pointer left
            k--;                  // 寫入指針左移 / move write pointer left
            continue;             // 跳回 while 檢查 / back to loop condition
        }

        // 兩邊都還有元素：取較大者放到尾部（這樣剩下的都 <= 它，仍是合法的非遞減）。
        // Both sides still have elements: place the larger one at slot k. Everything
        // left to place is <= it, preserving non-decreasing order from k rightward.
        if (nums1[i] > nums2[j]) {
            nums1[k] = nums1[i];  // nums1[i] 較大，放到 k / nums1[i] is larger, write it to k
            i--;                  // nums1 指針左移 / move nums1 read pointer left
        } else {
            // 相等時取 nums2[j] 也可，結果仍為非遞減排序。
            // On tie we pick nums2[j]; result is still non-decreasing either way.
            nums1[k] = nums2[j];  // nums2[j] 較大或相等，放到 k / nums2[j] wins (or tied), write to k
            j--;                  // nums2 指針左移 / move nums2 pointer left
        }
        k--;  // 無論走哪條分支，寫入位置都要左移一格 / write slot shifts left either way
    }
    // 迴圈結束時 j < 0：nums2 全部處理完畢，nums1 前段本來就排好，直接結束即可。
    // When the loop exits, j < 0: nums2 is fully merged and nums1's front prefix
    // was already sorted in place — no more work needed.
}
