leetcode 148. 排序链表

123 阅读1分钟

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)
};