classSolution { public: ListNode *sortList(ListNode *head){ if (head == nullptr) returnnullptr; int len = 0; ListNode *index = head; while (index != nullptr) { index = index->next; len++; } ListNode dummy(-1, head); for (int subLen = 1; subLen < len; subLen <<= 1) { ListNode *pre = &dummy; ListNode *cur = dummy.next;
while (cur) { ListNode *head1 = cur;
for (int i = 1; i < subLen && cur->next != nullptr; i++) cur = cur->next;
ListNode *head2 = cur->next; cur->next = nullptr; cur = head2; for (int i = 1; i < subLen && cur != nullptr && cur->next != nullptr; i++) cur = cur->next;
ListNode *next = nullptr; if (cur != nullptr) { next = cur->next; cur->next = nullptr; } ListNode *merged = merge(head1, head2); pre->next = merged; while (pre->next != nullptr) pre = pre->next; cur = next; } } return dummy.next; } ListNode *merge(ListNode *l, ListNode *r){ ListNode pre(-1); ListNode *cur = ⪯ while (l != nullptr && r != nullptr) { if (l->val < r->val) { cur->next = l; l = l->next; } else { cur->next = r; r = r->next; } cur = cur->next; } if (l != nullptr) cur->next = l; else cur->next = r; return pre.next; } };