【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;
}
}
};
重点思路
归并排序非常适合链表的排序(因为不需要申请额外的内存空间,并且是稳定的算法)。本题需要注意的是需要寻找中点和断链的方法。