归并过程一般这么写

while (i <= u1 && j <= u2) {
    if (nums[i] < nums[j]) {
        merged[k++] = nums[i++];
    } else {
        merged[k++] = nums[j++];
    }
} 
while (i <= u1) {
    merged[k++] = nums[i++];
}
while (j <= u2) {
    merged[k++] = nums[j++];
}

有时见这么写

while (i <= u1 || j <= u2) {
    if (j > u2 || (i <= u1 && nums[i] < nums[j]) {
        merged[k++] = nums[i++];
    } else {
        merged[k++] = nums[j++];
    }
}

可在两有序数组的公共元素间跳跃前进,求最大路径和

int maxSum(vector<int>& A, vector<int>& B) {
    // 数组有些公共元素,公共元素间的路径两数组各有一条,选大的那条
    const int MOD = 1e9 + 7;
    const int M = A.size(), N = B.size();
    int i = 0, j = 0;
    long sumA = 0, sumB = 0;
    while (i < M || j < N) {
        if (j == N || (i < M && A[i] < B[j])) {
            sumA += A[i++];
        } else if (i == M || (j < N && A[i] > B[j])) {
            sumB += B[j++];
        } else {
            sumA = sumB = max(sumA, sumB) + A[i];
            i++, j++;
        }
    }
    return max(sumA, sumB) % MOD;
}