c++
class Solution {
public:
ListNode* mergeList(ListNode *head, int n) {
if (!head || !head->next) return head;
ListNode *mid = head, *p = head;
int l = n / 2, r = n - l;
for (int i = 1; i < l; i++) p = p->next;
mid = p->next;
p->next = nullptr;
head = mergeList(head, l);
mid = mergeList(mid, r);
ListNode newhead(0);
ListNode *q = &newhead;
while (head || mid) {
if (!mid || (head && head->val <= mid->val)) {
q->next = head;
head = head->next;
q = q->next;
} else {
q->next = mid;
mid = mid->next;
q = q->next;
}
}
return newhead.next;
}
ListNode* sortList(ListNode* head) {
if (!head || !head->next) return head;
int n = 0;
ListNode *p = head;
while (p) {
p = p->next;
n++;
}
return mergeList(head, n);
}
};
js
var mergeList = function(head, n) {
if (!head || !head.next) return head;
var l = 0, r = 0, lp = head, rp = lp, p;
if (n % 2) l = (n - 1) / 2;
else l = n / 2;
r = n - l;
for (var i = 1; i < l; i++) rp = rp.next;
p = rp, rp = rp.next;
p.next = null;
lp = mergeList(lp, l);
rp = mergeList(rp, r);
var ret = new ListNode();
p = ret;
while (lp || rp) {
if (!rp || (lp && lp.val <= rp.val)) {
p.next = lp;
lp = lp.next;
p = p.next;
} else {
p.next = rp;
rp = rp.next;
p = p.next;
}
}
return ret.next;
}
var sortList = function(head) {
if (!head || !head.next) return head;
var p = head, n = 0;
while (p) p = p.next. n += 1;
return mergeList(head, n)
};