LeetCode 148 Sort List 链表上的归并排序和快速排序

Sort a linked list in O(n log n) time using constant space complexity.

单链表排序----快排 & 归并排序

(1)归并排序

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* sortList(ListNode* head) {
12         if (head == nullptr || head->next == nullptr)
13             return head;
14         ListNode* slow = head;
15         ListNode* fast = head;
16         ListNode* mid = nullptr;
17         while (fast&&fast->next)
18         {
19             mid = slow;
20             slow = slow->next;
21             fast = fast->next->next;
22         }
23         mid->next = nullptr;
24         return mergeHelp(sortList(head), sortList(slow));
25     }
26     ListNode* mergeHelp(ListNode* low, ListNode* high)
27     {
28         ListNode* head = new ListNode(-1);
29         ListNode* cur = head;
30         while (low&&high)
31         {
32             if (low->val < high->val)
33             {
34                 cur->next = low;
35                 low = low->next;
36             }
37             else
38             {
39                 cur->next = high;
40                 high = high->next;
41             }
42             cur = cur->next;
43         }
44         cur->next = low ? low : high;
45         return head->next;
46     }
47 };

(2)快速排序

①.使第一个节点为中心点;
②.创建2个指针(first,second),first指向头结点,second指向first的下一个节点;
③.second开始遍历,如果发现second的值比中心点的值小,则此时first=first.next,并且执行当前first的值和second的值交换,second遍历到链表尾即可;
④.把头结点的值和first的值执行交换。此时first节点为中心点,并且完成1轮快排
⑤.使用递归的方法即可完成排序检测是否合法

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* sortList(ListNode* head) {
12         if(head==nullptr)
13             return head;
14         quickSort(head,nullptr);
15         return head;
16     }
17     void quickSort(ListNode* begin,ListNode* end)
18     {
19         if(begin!=end)
20         {
21             ListNode* sep=getSeperator(begin,end);
22             quickSort(begin,sep);
23             quickSort(sep->next,end);
24         }
25     }
26     ListNode* getSeperator(ListNode* begin,ListNode* end)
27     {
28         ListNode* first=begin;
29         ListNode* second=begin->next;
30         int key=begin->val;
31         while(second!=end)
32         {
33             if(second->val<key)
34             {
35                 first=first->next;
36                 swap(first,second);
37             }
38             second=second->next;
39         }
40         swap(begin,first);
41         return first;
42     }
43     void swap(ListNode* a,ListNode* b)
44     {
45         int tmp=a->val;
46         a->val=b->val;
47         b->val=tmp;
48     }
49 };

 

posted on 2018-03-08 19:06  lina2014  阅读(168)  评论(0编辑  收藏  举报

导航