Sort a linked list in O(n log n) time using constant space complexity.
单链表适合用归并排序,双向链表适合用快速排序。本题可以复用Merge Two Sorted Lists方法
/********************************* * 日期:2015-01-12 * 作者:SJF0115 * 题目: 148.Sort List * 来源:https://oj.leetcode.com/problems/sort-list/ * 结果:AC * 来源:LeetCode * 博客: **********************************/ #include <iostream> #include <climits> using namespace std; struct ListNode{ int val; ListNode *next; ListNode(int x):val(x),next(NULL){} }; class Solution { public: ListNode *sortList(ListNode *head) { // 容错处理 if(head == NULL || head->next == NULL){ return head; }//if // 定义两个指针 ListNode *fast = head,*slow = head; // 慢指针找到中间节点 while(fast->next != NULL && fast->next->next != NULL){ // 快指针一次两步 fast = fast->next->next; // 慢指针一次一步 slow = slow->next; }//while // 从中间节点断开 fast = slow->next; slow->next = NULL; // 前段排序 ListNode *left = sortList(head); // 后段排序 ListNode *right = sortList(fast); // 前后段合并 return mergeTwoLists(left,right); } private: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { ListNode *head = new ListNode(-1); for(ListNode *p = head;l1 != NULL || l2 != NULL;p = p->next){ int val1 = (l1 == NULL) ? INT_MAX : l1->val; int val2 = (l2 == NULL) ? INT_MAX : l2->val; if(val1 <= val2){ p->next = l1; l1 = l1->next; }//if else{ p->next = l2; l2 = l2->next; }//else }//for return head->next; } }; int main(){ Solution solution; int A[] = {8,3,10,5,11,1,4}; // 链表 ListNode *head = new ListNode(A[0]); ListNode *p = head; for(int i = 1;i < 7;i++){ ListNode *node = new ListNode(A[i]); p->next = node; p = node; }//for head = solution.sortList(head); // 输出 p = head; while(p){ cout<<p->val<<" "; p = p->next; }//while cout<<endl; return 0; }