代码改变世界

leetcode - Sort List

2013-11-20 14:26  张汉生  阅读(167)  评论(0)    收藏  举报

 

 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 * mergeList(ListNode * left, ListNode * right){
12         ListNode * head = NULL, *lastNode, *curNode;
13         while ((left != NULL) && (right != NULL)){
14             if (left->val <= right->val){
15                 curNode = left;
16                 left = left->next;
17             }
18             else {
19                 curNode = right;
20                 right = right->next;
21             }
22             if (head == NULL)
23                 head = curNode;
24             else lastNode->next = curNode;
25             lastNode = curNode;
26         }
27         if (left != NULL){
28             if (head == NULL)
29                 return left;
30             else lastNode->next = left;
31         }
32         if (right != NULL){
33             if (head == NULL)
34                 return right;
35             else lastNode->next = right;
36         }
37         return head;
38     }
39     ListNode *sortList(ListNode *head) {
40         // IMPORTANT: Please reset any member data you declared, as
41         // the same Solution instance will be reused for each test case.
42         if (head == NULL || head->next == NULL)
43             return head;
44         ListNode * lhead = head, *rhead = head->next, *ltail = head;
45         ListNode * itr = head->next;
46         while ((itr != NULL) && (itr->next != NULL)){
47             ltail = ltail->next;
48             rhead = rhead->next;
49             itr = (itr->next)->next;
50         }
51         ltail->next = NULL;
52         return mergeList(sortList(lhead), sortList(rhead));
53     }
54 };