您的位置:首页 > 其它

链表排序Sort_List(归并)

2018-03-19 21:46 411 查看
题目:Sort a linked list in O(n log n) time using constant space complexity.

因为题目要求复杂度为O(nlogn),故可以考虑归并排序的思想。 归并排序的一般步骤为: 1)将待排序数组(链表)取中点并一分为二; 2)递归地对左半部分进行归并排序; 3)递归地对右半部分进行归并排序; 4)将两个半部分进行合并(merge),得到结果。

实现:
 * 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 == NULL || head->next == NULL) return head;
         ListNode* slow = head;
         ListNode* fast = head;
         while (fast->next)
         {
              if (fast->next->next)
                 {
                    fast = fast->next->next;
                    slow = slow->next;
                 }
                else
                        {
                            fast = fast->
4000
;next;
                         }
          }
          ListNode * headb = slow->next;
          slow->next = NULL;
          return MergeList(sortList(head), sortList(headb));
    }
    
    ListNode* MergeList(ListNode * list1, ListNode* list2)
    {
      if(list1 == NULL)
               return list2;
      if(list2 == NULL)
               return list1;
      ListNode * phead = NULL;
      if(list1->val < list2->val)
        {
          phead = list1;
          phead->next = MergeList(list1->next,list2);
        }
        else
              {
                 phead = list2;
                 phead->next = MergeList(list2->next, list1);
              }
        return phead;
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: