问题描述:
Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3 Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0 Output: -1->0->3->4->5
解题思路:
说到O(nlogn)那就必然想到快速排序和归并排序和堆排序
参考大佬整理的方法
代码:
归并排序
这里用快慢指针找到中点并且然后将链表打碎成2个链表
然后对两个链表分别排序后,再调用归并。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* sortList(ListNode* head) { if(!head || !head->next) return head; ListNode *slow = head, *fast = head, *pre = head; while(fast && fast->next){ pre = slow; slow = slow->next; fast = fast->next->next; } pre->next = NULL; return merge(sortList(head), sortList(slow)); } ListNode* merge(ListNode* l1, ListNode* l2){ if(!l1) return l2; if(!l2) return l1; if(l1->val < l2->val) { l1->next = merge(l1->next, l2); return l1; } else { l2->next = merge(l1, l2->next); return l2; } } };
堆排序:
注意比较器的重写!!
struct cmp{
bool operator() (const ListNode* l1, const ListNode* l2){
return l1->val > l2->val;
}
参考链接:priority_queue & 结构体||类 & 自定义比较函数cmp
priority_queue<ListNode*, vector<ListNode*>, cmp> q;
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { struct cmp{ bool operator() (const ListNode* l1, const ListNode* l2){ return l1->val > l2->val; } }; public: ListNode* sortList(ListNode* head) { if(!head || !head->next) return head; priority_queue<ListNode*, vector<ListNode*>, cmp> q; ListNode* ret; ListNode *p = head; while(p){ ListNode* temp = p->next; p->next = NULL; q.push(p); p = temp; } ret = q.top(); q.pop(); ListNode *pre = ret; while(!q.empty()){ ListNode *cur = q.top(); q.pop(); pre->next = cur; pre = cur; } return ret; } };