// 技巧:从后向前public void merge(int[] nums1, int m, int[] nums2, int n) { int k = m + n - 1; int i = m - 1, j = n - 1; while (i >= 0 && j >= 0) { if (nums1[i] >= nums2[j]) { nums1[k--] = nums1[i--]; } else { nums1[k--] = nums2[j--]; } } while (i >= 0) nums1[k--] = nums1[i--]; while (j >= 0) nums1[k--] = nums2[j--];}public void merge(int[] nums1, int m, int[] nums2, int n) { int k = m + n - 1, prev = nums1[m - 1] + nums2[n - 1] + 1; int i = m - 1, j = n - 1; while (i >= 0 && j >= 0) { if (nums1[i] >= nums2[j]) { if (nums1[i] == prev) i--; else { nums1[k] = nums1[i--]; prev = nums1[k--]; } } else { if (nums2[j] == prev) j--; else { nums1[k] = nums2[j--]; prev = nums1[k--]; } }
} while (i >= 0) { if (nums1[i] == prev) i--; else { nums1[k] = nums1[i--]; prev = nums1[k--]; } } while (j >= 0) { if (nums2[j] == prev) i--; else { nums1[k] = nums2[j--]; prev = nums1[k--]; } } System.out.println(m + n - k - 1); for (i = k + 1; i < m + n; i++) { nums1[i - k - 1] = nums1[i]; }}// 时间复杂度 : O(nlogk)// 空间复杂度 : O(n) -> 若不算返回数组 O(k)public int[] merge(int[][] nums) { int idx = 0, n = 0; for (int i = 0; i < nums.length; i++) n += nums[i].length; int[] ans = new int[n]; Queue<int[]> q = new PriorityQueue<>((a, b) -> nums[a[0]][a[1]] - nums[b[0]][b[1]]); for (int i = 0; i < nums.length; i++) { if (nums[i].length != 0) q.offer(new int[]{i, 0}); } while (!q.isEmpty()) { int[] cur = q.poll(); ans[idx++] = nums[cur[0]][cur[1]]; if (cur[1] + 1 < nums[cur[0]].length) q.offer(new int[]{cur[0], cur[1] + 1}); } return ans;}// 调用过程int[] arr = merge(new int[][]{ {2, 3, 6}, {1, 4, 5, 7, 9}, {2, 8, 10}});直接在变题二的基础上修改即可!
public int[] merge(int[][] nums) { int idx = 0, n = 0; for (int i = 0; i < nums.length; i++) n += nums[i].length; int[] ans = new int[n]; Queue<int[]> q = new PriorityQueue<>((a, b) -> nums[a[0]][a[1]] - nums[b[0]][b[1]]); for (int i = 0; i < nums.length; i++) { if (nums[i].length != 0) q.offer(new int[]{i, 0}); } int prev = nums[q.peek()[0]][q.peek()[1]] - 1; while (!q.isEmpty()) { int[] cur = q.poll(); // 修改部分 if (prev != nums[cur[0]][cur[1]]) { ans[idx++] = nums[cur[0]][cur[1]]; prev = nums[cur[0]][cur[1]]; } if (cur[1] + 1 < nums[cur[0]].length) q.offer(new int[]{cur[0], cur[1] + 1}); } return ans;}