【LeetCode-148】排序链表

问题

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

示例

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

解答1:归并排序

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        return merge(head);
    }
private:
    ListNode* findMid(ListNode* head) {
        ListNode *slow = head, *fast = head;
        while (fast && fast->next && fast->next->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }
    ListNode* merge(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode* mid = findMid(head); // 寻找中点(如果是偶数个节点,就找靠前的一个)
        ListNode* nxt_head = mid->next;
        mid->next = nullptr; // 断链
        return merge2Lists(merge(head), merge(nxt_head));
    }
    ListNode* merge2Lists(ListNode* l1, ListNode* l2) {
        if (!l1) return l2;
        if (!l2) return l1;
        if (l1->val > l2->val) {
            l2->next = merge2Lists(l1, l2->next); 
            return l2;
        } else {
            l1->next = merge2Lists(l1->next, l2); 
            return l1;
        }
    }
};

重点思路

归并排序非常适合链表的排序(因为不需要申请额外的内存空间,并且是稳定的算法)。本题需要注意的是需要寻找中点和断链的方法。

posted @ 2021-03-27 12:10  tmpUser  阅读(37)  评论(0编辑  收藏  举报