简介
链表排序是一道常见的关于链表的算法题,往往我们会使用冒泡排序或者选择排序这两种算法来解决这个问题。但是它们的时间复杂度是O(n²),效率不高。所以今天我们要实现时间复杂度O(nlogn)的算法就不能再选择这两种排序算法。而满足这个时间复杂度的排序算法只有快速排序,堆排序和归并排序。但是因为快排和堆排是不稳定的,所以我选择了归并排序算法来实现链表排序问题。
关于归并排序我以前写过一篇博客,里面介绍了它的算法思想:http://blog.youkuaiyun.com/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;
}