【面经笔记】链表归并排序
来源:互联网 发布:手机屏幕长截图软件 编辑:程序博客网 时间:2024/06/04 00:26
链表适合归并排序
时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:稳定
#include <iostream>using namespace std;class Node{public: Node(){ next = NULL; val = 0; }; Node(int i){ next = NULL; val = i; }; Node* next; int val;};Node* merge(Node* pleft, Node* pright){ if (pleft == NULL) { return pright; } if (pright == NULL) { return pleft; } Node dummy; Node* ptmp = &dummy; while (pleft != NULL&&pright != NULL) { if (pleft->val < pright->val) { ptmp->next = pleft; pleft = pleft->next; ptmp = ptmp->next; } else { ptmp->next = pright; pright = pright->next; ptmp = ptmp->next; } } if (pleft!=NULL) { ptmp->next = pleft; } if (pright!=NULL) { ptmp->next = pright; } return dummy.next;}Node * MergeSort(Node * phead){ if (phead == NULL|| phead->next == NULL) { return phead; } Node * pfast(phead); Node * pslow(phead); while (pfast->next != NULL&&pfast->next->next != NULL) //while (pfast != NULL&&pfast->next != NULL)错误,无法分割两个点 { pfast = pfast->next->next; pslow = pslow->next; } Node * pleftpart = phead; Node * prightpart = pslow->next; pslow->next = NULL; pleftpart = MergeSort(pleftpart); prightpart = MergeSort(prightpart); return merge(pleftpart, prightpart);}int main(){ Node n1(4); Node n2(3); Node n3(2); Node n4(1); n1.next = &n2; n2.next = &n3; n3.next = &n4; auto tmp = MergeSort(&n1); while (tmp) { cout << tmp->val << endl; tmp = tmp->next; } return 0;}
查找中间节点使用快慢指针
while (pfast != NULL&&pfast->next != NULL) //无法分割两个点的情况
阅读全文
0 0
- 【面经笔记】链表归并排序
- [各种面试题] 链表归并排序
- 链表归并排序
- 链表归并排序
- 链表归并排序
- 链表归并排序
- 链表归并排序
- 链表归并排序
- 链表归并排序
- 归并排序链表
- 链表归并排序
- 链表归并排序
- 链表归并排序
- 链表归并排序
- 链表排序 归并排序
- 链表排序--归并排序
- 算法笔记--归并排序
- 归并排序学习笔记
- JavaScript 变量 数据类型
- 立方和不等式 oj125
- OpenGL 图形变换
- HDU3782 xxx定律【数学计算+水题】
- 使用eclipse来进行可视化编程的过程感悟
- 【面经笔记】链表归并排序
- Python3package包
- muduo makefile
- fdisk命令找不到的解决方法
- 回文数(一) oj128
- A
- FZU2259 : 图
- bootstrap的遮罩层挡住了弹出了选择器
- Java--面向对象