首页 > 其他 > 详细

Sort List [LeetCode]

时间:2014-02-04 01:57:10      阅读:400      评论:0      收藏:0      [点我收藏+]

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

Summary: Basicly I apply quick sort to linked lists.

Everytime, I get the head of the list and split the whole linked list to two lists with its value, all the left nodes have value which are less than value of head, and all the right nodes have value which are greater than head‘s value, and all value which are same to value of head will not go to next recursion.

To archive this, I use two pointers, left_tail and right_tail to record both tail of left list and right list. With a variable left_head, I record the pointer to the node whose value equals to head‘s.

bubuko.com,布布扣
 1     ListNode *binarySort(ListNode *head, ListNode * left, ListNode * right) {
 2         //zero or one elment
 3         if(head == right || head->next == right)
 4             return head;
 5             
 6         ListNode * left_head = head;
 7         ListNode * current = head->next;
 8         ListNode * left_tail = left;
 9         ListNode * right_tail = head;
10         while(current != right) {
11             if(current->val <= head->val) {
12                 ListNode * next = current->next;
13                 current->next = left_head;
14                 left_tail->next = current;
15                 //handle duplicate value which equals to head->val
16                 //if equals then let left_head be the current, otherwise move left tail to next one. 
17                 if(current->val == head->val)
18                     left_head = current;
19                 else
20                     left_tail = left_tail->next;
21                 current = next;
22                 right_tail->next = next;
23                 
24             }else{
25                 current = current->next;
26                 right_tail = right_tail->next;
27             }
28         }
29         
30         //recursive sort the left part
31         if(left->next != head  )
32             binarySort(left->next, left, left_tail->next);
33             
34         //recursive sort the right part
35         if(head->next != right)
36             binarySort(head->next, head, right);
37         
38         return left->next;
39     }
40 
41     ListNode *sortList(ListNode *head) {
42         //add a head
43         ListNode * left = new ListNode(0);
44         left->next = head;
45         return binarySort(head, left, NULL);
46     }
bubuko.com,布布扣

Sort List [LeetCode]

原文:http://www.cnblogs.com/guyufei/p/3537510.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!