题目思路
两个数组非递减有序,合并到nums1且原地修改。
采用从后往前双指针:
i指向nums1有效尾部,j指向nums2尾部
k指向nums1最终尾部,每次放较大元素
最后把nums2剩余元素直接复制进nums1。
难点
从前向后会覆盖nums1原数据,必须从后往前
边界处理:m=0、n=0、一个数组先遍历完
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) { int p1 = m - 1, p2 = n - 1; int tail = m + n - 1; int cur; while (p1 >= 0 || p2 >= 0) { if (p1 == -1) { cur = nums2[p2--]; } else if (p2 == -1) { cur = nums1[p1--]; } else if (nums1[p1] > nums2[p2]) { cur = nums1[p1--]; } else { cur = nums2[p2--]; } nums1[tail--] = cur; } }