归并排序链表
2016-04-09 17:17
197 查看
时间复杂度O(N*logN),空间复杂度O(1)
参考 http://www.cnblogs.com/TenosDoIt/p/3666585.html
参考 http://www.cnblogs.com/TenosDoIt/p/3666585.html
#include <iostream> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ListNode *merge(ListNode *head1, ListNode *head2){ if (head1 == NULL) return head2; if (head2 == NULL) return head1; ListNode *head; if (head1->val < head2->val){ head = head1; head1 = head1->next; } else{ head = head2; head2 = head2->next; } //两个链表不为空 ListNode *p = head; while(head1 != NULL && head2 != NULL){ if (head1->val < head2->val){ p->next = head1; head1 = head1->next; } else{ p->next = head2; head2 = head2->next; } p = p->next; } //一个链表不为空 if (head1 != NULL){ p->next = head1; } else if (head2 != NULL){ p->next = head2; } return head; } ListNode *merge_sort_list(ListNode *head){ if (head == NULL || head->next == NULL){ //0个或1个结点 return head; } //找到中间结点 ListNode *fast = head; ListNode *slow = head; while(fast->next != NULL && fast->next->next != NULL){ fast = fast->next->next; slow = slow->next; } ListNode *fast_start = slow->next; slow->next = NULL; fast = merge_sort_list(fast_start); //后半段 slow = merge_sort_list(head); //前半段 return merge(fast, slow); } int main(){ ListNode *head = new ListNode(0); ListNode *node1 = new ListNode(3); ListNode *node2 = new ListNode(1); ListNode *node3 = new ListNode(2); ListNode *node4 = new ListNode(6); ListNode *node5 = new ListNode(5); ListNode *node6 = new ListNode(4); head->next = node1; node1->next = node2; node2->next = node3; node3->next = node4; node4->next = node5; node5->next = node6; ListNode *p = head; while(p){ cout << p->val << '\t'; p = p->next; } cout << endl; ListNode *result = merge_sort_list(head); p = result; while(p){ cout << p->val << '\t'; p = p->next; } cout << endl; int ttt = 0; return 0; }
相关文章推荐
- Java异常处理和I/O处理
- python函数式编程之(open(var1 if not var2 else var2))
- 虚幻4 TaskGraph小记
- 使用canvas编写环形图.
- 扩展型模式之Decorator(装饰器)模式
- 希尔排序算法的C语言实现示例
- JavaScript里的类和继承
- BZOJ3439: Kpm的MC密码
- 根据前序遍历判断二叉搜索树
- winedt 自动换行
- CSS3实例教程:详解calc()函数功能
- 关于写保护
- 20145120 《Java程序设计》实验一实验报告
- 关于storm0.10.0版本的一个小bug
- 二叉树前序、中序、后序遍历相互求法
- Android数据转化为Excel表格导入导出
- Python抽象之类
- 转载:位图和矢量图的区别
- hdu1390Binary Numbers
- SVN conf配置文件信息