148. 排序链表

代码实现
class Solution {
private:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* pl1 = l1, *pl2 = l2;
ListNode* ans = new ListNode();
ListNode* curNode = ans;
while (pl1 && pl2) {
ListNode* tmp;
if (pl1->val <= pl2->val) {
tmp = new ListNode(pl1->val);
pl1 = pl1->next;
}
else {
tmp = new ListNode(pl2->val);
pl2 = pl2->next;
}
curNode->next = tmp;
curNode = tmp;
}
if (pl1) {
curNode->next = pl1;
}
else {
curNode->next = pl2;
}
return ans->next;
}
public:
ListNode* sortList(ListNode* head) {
if (!head) return head;
ListNode* dummyHead = new ListNode(-1, head);
int length = 0;
ListNode* cur = head;
while (cur) {
length++;
cur = cur->next;
}
for (int curLength = 1; curLength < length; curLength *= 2) {
ListNode* curr = dummyHead;
ListNode* prev = dummyHead;
while (curr) {
ListNode* head1 = curr->next;
for (int i = 0; i < curLength && curr; i++) {
curr = curr->next;
}
if (!curr || !curr->next) break;
ListNode* head2 = curr->next;
curr->next = nullptr;
curr = new ListNode(-1, head2);
for (int i = 0; i < curLength && curr; i++) {
curr = curr->next;
}
if (!curr || !curr->next) {
prev->next = mergeTwoLists(head1, head2);
break;
}
else {
ListNode* tmp = curr->next;
curr->next = nullptr;
prev->next = mergeTwoLists(head1, head2);
while (prev->next) prev = prev->next;
prev->next = tmp;
curr = prev;
}
}
}
return dummyHead->next;
}
};
315. 计算右侧小于当前元素的个数

代码实现
class Solution {
private:
vector<int> ans;
void mergeSort(vector<pair<int, int>>& tokens, vector<pair<int, int>>& tmp,
int l, int r) {
if (l == r) return;
int m = (l + r) >> 1;
mergeSort(tokens, tmp, l, m);
mergeSort(tokens, tmp, m + 1, r);
int i = l, j = m + 1, pos = l;
while (i <= m && j <= r) {
if (tokens[i].first <= tokens[j].first) {
tmp[pos++] = tokens[i];
ans[tokens[i].second] += j - m - 1;
i++;
}
else {
tmp[pos++] = tokens[j];
j++;
}
}
while (i <= m) {
tmp[pos++] = tokens[i];
ans[tokens[i].second] += j - m - 1;
i++;
}
while (j <= r) {
tmp[pos++] = tokens[j];
j++;
}
copy(tmp.begin() + l, tmp.begin() + r + 1, tokens.begin() + l);
}
public:
vector<int> countSmaller(vector<int>& nums) {
int n = nums.size();
vector<pair<int, int>> tokens;
for (int i = 0; i < n; i++) {
tokens.push_back({nums[i], i});
}
vector<pair<int, int>> tmp(n);
ans = vector<int>(n);
mergeSort(tokens, tmp, 0, n - 1);
return ans;
}
};