算法:链表的归并排序
来源:互联网 发布:java的输入流和输出流 编辑:程序博客网 时间:2024/06/06 18:12
要求:对一个单链表进行排序,时间复杂度为(NlogN)
// 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; sorted_merge(left, p1, p2, right); } //归并 void sorted_merge(ListNode *&head1, ListNode *&end1, ListNode *&head2, ListNode *&end2) { ListNode *new_start,*new_end, *tmp; if(head1->val < head2->val) { new_start = head1; head1 = head1->next; } else { new_start = head2; head2 = head2->next; } tmp = new_start; while(head1 != NULL && head2 != NULL) { if(head1->val < head2->val) { tmp->next = head1; tmp = head1; head1 = head1->next; } else { tmp->next = head2; tmp = head2; head2 = head2->next; } } if(head1 != NULL) { tmp->next = head1; new_end = end1; } else { tmp->next = head2; new_end = end2; } //返回新链表头和链表尾 head1 = new_start; end2 = new_end; end2->next = NULL; }};
0 0
- 算法:链表的归并排序
- 链表的归并排序算法
- 归并排序的算法
- 链表的归并排序:来自STL_ list_ sort 算法
- 高效链表排序-归并算法
- 【算法题】链表归并排序
- 链表的归并排序
- 链表的归并排序
- 链表的归并排序
- 链表的归并排序
- 链表的归并排序
- 链表的归并排序
- 链表的归并排序
- 链表的归并排序
- 归并排序--基础的算法
- 归并排序的递归算法
- 归并排序的简单算法
- 改进的归并排序算法
- whu 1124 Football Coach(最大流,判断满流)
- application开发(网上总结)
- Python3.2官方文档教程---元组与序列
- LeetCode之Search Insert Position
- poj3181-完全背包+高精度
- 算法:链表的归并排序
- ActionBarActivity ActionBar Fragment
- 3.要学习的东西不仅仅是技术本身
- C++ 新手游戏开发之细节问题(1)
- 北邮新OJ91
- linux 安装部署 apache http server
- 有关windows的多线程
- hdu1003 Max Sum (DP)
- 线人