链表的二路归并排序 Sort List
2014-03-12 13:43
465 查看
对于链表的排序问题,想找一种时间复杂度为O(nlogn),空间复杂度O(1)的算法。该问题源自于Leetcode,Sort a linked list in O(n log n)
time using constant space complexity.
首先想到了归并排序,因为链表的归并不需要辅助空间。
思路:和数组的二路归并基本一致。
所不同的是:
1、要遍历一遍才能找到中间位置。
2、首尾位置都要记下来,因为链表不是自然相邻的。所以排序后返回时要返回首尾结点的新指针。
3、遍历查找时也要注意链表结尾判定可能不再是NULL。
PS:链表的排序用快速排序应该也可以做到。
time using constant space complexity.
首先想到了归并排序,因为链表的归并不需要辅助空间。
思路:和数组的二路归并基本一致。
所不同的是:
1、要遍历一遍才能找到中间位置。
2、首尾位置都要记下来,因为链表不是自然相邻的。所以排序后返回时要返回首尾结点的新指针。
3、遍历查找时也要注意链表结尾判定可能不再是NULL。
/** * 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) return NULL; ListNode *end = head; while(end->next != NULL) end = end->next; sort(head, end); return head; } void sort(ListNode* &left, ListNode* &right) { if(left == right) return; //寻找中间位置 ListNode *p1, *p2; p1 = p2 = left; while(p2 != right && p2->next != right) { p1 = p1->next; p2 = p2->next->next; } p2 = p1->next; //递归分治 sort(left, p1); sort(p2, right); p1->next = NULL; right->next = NULL; //归并 ListNode *new_start,*new_end, *tmp; if(left->val < p2->val) { new_start = left; left = left->next; } else { new_start = p2; p2 = p2->next; } tmp = new_start; while(left != NULL && p2 != NULL) { if(left->val < p2->val) { tmp->next = left; tmp = left; left = left->next; } else { tmp->next = p2; tmp = p2; p2 = p2->next; } } if(left != NULL) { tmp->next = left; new_end = p1; } else { tmp->next = p2; new_end = right; } //返回新链表头和链表尾 left = new_start; right = new_end; right->next = NULL; } };
PS:链表的排序用快速排序应该也可以做到。
相关文章推荐
- Sort List——经典(链表中的归并排序)
- [C++]LeetCode: 125 Sort List (归并排序链表)
- Sort List (使用归并排序的链表排序)
- [leetcode] 134 Sort List (链表 & 归并排序)
- 【LeetCode】Sort List 解题报告(对链表进行归并排序)
- leetcode:Sort List(链表的归并排序)
- 148. Sort List--单链表自底向上归并排序
- Leetcode Sort List 链表归并排序
- leetcode 148. Sort List 链表归并排序
- 链表的归并排序 特殊优化, merge sort for list,非快慢指针法
- sort-list——链表、快慢指针找中间、归并排序
- 【链表】Sort List(归并排序)
- leetcode_效率题解_148. Sort List_(链表归并排序)
- LeetCode Sort List 链表的归并排序
- 148. Sort List 链表归并排序
- leetcode:Sort List(一个链表的归并排序)
- leetcode 148. Sort List 链表 归并排序 和 快排
- 148. Sort List(链表的归并排序,用快慢指针来partition)
- Insertion Sort List 链表插入排序
- Leetcode 147. Insertion Sort List(链表实现快排)