实现时间复杂度为O(nlogn)的链表排序算法

来源:互联网 发布:对人工智能的看法400字 编辑:程序博客网 时间:2024/05/20 18:20

简介

链表排序是一道常见的关于链表的算法题,往往我们会使用冒泡排序或者选择排序这两种算法来解决这个问题。但是它们的时间复杂度是O(n²),效率不高。所以今天我们要实现时间复杂度O(nlogn)的算法就不能再选择这两种排序算法。而满足这个时间复杂度的排序算法只有快速排序,堆排序和归并排序。但是因为快排和堆排是不稳定的,所以我选择了归并排序算法来实现链表排序问题。

关于归并排序我以前写过一篇博客,里面介绍了它的算法思想:http://blog.csdn.net/mbuger/article/details/65451607

下面给出代码实现

class ListNode {//结构定义public:    int val;    ListNode *next;    ListNode(int val)     {        this->val = val;        this->next = NULL;    }   };ListNode* SortList(ListNode* head){    if (head == NULL || head->next == NULL)        return head;    ListNode* fast;    ListNode* slow;    while (fast->next != NULL && fast->next->next != NULL)    {//通过快慢指针法寻找中间结点        fast = fast->next;        fast = fast->next;        slow = slow->next;    }    ListNode* mid = slow->next;    slow->next == NULL;//把链表拆分开为两个链表    //分治思想,递归    ListNode* list1 = SortList(head);    ListNode* list2 = SortList(mid);    ListNode* sorted = Merge(list1, list2);    return sorted;}ListNode* Merge(ListNode* list1, ListNode* list2){//合并    if (list1 == NULL)        return list2;    if (list2 == NULL)        return list1;    ListNode* head;    ListNode* tmp;    if (list1->val < list2->val)    {        head = list1;        list1 = list1->next;    }    else    {        head = list2;        list2 = list2->next;    }    tmp = head;    while (list1 && list2)    {        if (list1->val < list2->val)        {            tmp->next = list1;            tmp = tmp->next;            list1 = list1->next;        }        else        {            tmp->next = list2;            tmp = tmp->next;            list2 = list2->next;        }    }    if (list1 == NULL)    {        tmp->next = list2;    }    if (list2 == NULL)    {        tmp->next = list1;    }    return head;}
0 0