链表排序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;
}
};
因为题目要求复杂度为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;
}
};
相关文章推荐
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- 链表的归并排序:来自STL_ list_ sort 算法
- 148 Sort List (归并实现链表排序)
- LeetCode-Sort List,链表排序(插入和归并),时间复杂度O(n^2) and O(nlgn)
- LeetCode Sort List(链表排序)
- LeetCode-Sort List-链表排序-归并排序+链表调整
- LeetCode Sort List(链表排序)
- [LeetCode]86. Sort List链表排序
- [LeetCode] Sort List 链表排序
- [LeetCode] 148. Sort List 链表排序
- 【数据结构与算法基础】单链表及其应用基数排序 / Singly Linked List and radix sort
- 排序链表(Sort linked list)
- LeetCode-Sort List 链表排序
- LeetCode 148.Sort List 链表排序
- [Leetcode] insertion sort list 链表插入排序
- LeetCode-147. Insertion Sort List (JAVA)链表插入排序
- 001-021-merger two sorted List 归并两个已排序的链表
- 148. Sort List (java 给单链表排序)
- SortList 单链表排序 要求复杂度O(NlgN)
- Leetcode 148 Sort List 单链表排序