leetcode系列(2)链表排序

来源:互联网 发布:java 短信防刷 编辑:程序博客网 时间:2024/05/23 16:50

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

咋一看貌似很简单,直接用链表的快速排序,结果爆出time limit exceed,这不科学啊,后来一想快排有退化的可能,如下表:

归并排序(稳定)O(nlogn)O(nlogn)O(nlogn)快速排序(不稳定)O(nlogn)O(nlogn)O(n^2)堆排序(不稳定)O(nlogn)O(nlogn)O(nlogn)所以觉得用归并排序,主要就是分裂链表,和合并有序链表(用递归可以方便的实现),提交后马上AC。

贴上我的自己的xcode上的代码,包含了两种排序方法。

////  qsort_list.cpp//  leet_code////  Created by meng duan on 14-4-3.//  Copyright (c) 2014年 886524. All rights reserved.//#include "common.h"class QsortList {public:    struct ListNode {        int val;        ListNode *next;        ListNode (int x) : val(x), next(NULL) {}    };    // 快速排序部分    ListNode *listPart(ListNode *head, ListNode *end) {        ListNode *ret = head;        ListNode *p1 = head;        ListNode *p2 = head->next;        int val = head->val;        for ( ; p2 != end; p2 = p2->next) {            if (p2->val < val) {                int tmp = p2->val;                p1 = p1->next;                p2->val = p1->val;                p1->val = tmp;                            }        }        head->val = p1->val;        p1->val = val;        ret = p1;        return ret;    }    void listSort(ListNode *head, ListNode *end) {        if (head != end && head->next != end) {            ListNode *mid = listPart(head,end);            listSort(head, mid);            listSort(mid->next,end);        }    }    ListNode *sortList (ListNode *head) {        // if (head) {        // listSort(head,NULL);        // }        // return head;        if (head && head->next) {            mergeSort(&head);        }        return head;    }    // 归并排序部分    void mergeSort(ListNode **head) {        if (*head && (*head)->next) {            ListNode *p1 = *head;            ListNode *p2 = listSplit(*head);            mergeSort(&p1);            mergeSort(&p2);            *head = mergeSortList(p1,p2);        }    }    ListNode *listSplit(ListNode *head) {        if (head && head->next) {            ListNode *p1 = head;            ListNode *p2 = head->next;            while (p2) {                p2 = p2->next;                if (p2) {                    p1 = p1->next;                    p2 = p2->next;                }            }            p2 = p1->next;            p1->next = NULL;            return p2;        }        return head;    }    ListNode *mergeSortList(ListNode *p1, ListNode *p2) {        if (NULL == p1) {            return p2;        } else if (NULL == p2) {            return p1;        } else if (p1->val < p2->val) {            p1->next = mergeSortList(p1->next, p2);            return p1;        } else {            p2->next = mergeSortList(p1, p2->next);            return p2;        }    }    };int main (int argc, char **argv){    typedef QsortList::ListNode Node_t;    Node_t *head = new Node_t(0);    for (int i = 1; i < 5; ++i) {        Node_t *node = new Node_t(i);        node->next = head;        head = node;    }    QsortList m;    head = m.sortList(head);    while (head) {        cout<<head->val<<endl;        head = head->next;    }    return 0;}




0 0
原创粉丝点击