ListNode* mergeKLists(vector<ListNode*>& lists, int l, int r){ if (l == r) return lists[l]; if (l > r) returnnullptr; int m = (l + r) >> 1; auto left = mergeKLists(lists, l, m); auto right = mergeKLists(lists, m + 1, r); returnmergeTwoLists(left, right); }
classSolution { public: // 向下调整 voidheapify(vector<int>& nums, int i, int n){ int largest = i; int left = i * 2 + 1; int right = i * 2 + 2; if (left < n && nums[left] > nums[largest]) largest = left; if (right < n && nums[right] > nums[largest]) largest = right; if (largest != i) { swap(nums[largest], nums[i]); heapify(nums, largest, n); } }
voidheapsort(vector<int>& nums){ int n = nums.size(); // i = n / 2 也可, 多判断一次而已 // 向上初始化构建, 获取数组最大值 for (int i = n / 2 - 1; i >= 0; i--) { heapify(nums, i, n); } // 最大值不断调整到末尾, 并对新元素 nums[0] 向下进行调整 for (int i = n - 1; i >= 0; i--) { swap(nums[i], nums[0]); heapify(nums, 0, i); // 每次都从 0 开始调整 } }