面试题76:单链表的归并排序
来源:互联网 发布:多路访问网络 编辑:程序博客网 时间:2024/05/21 13:30
时间复杂度:O(nlgn)
#include <iostream>#include <string>using namespace std;/*MergeSort(headRef)1) If head is NULL or there is only one element in the Linked Listthen return.2) Else divide the linked list into two halves.FrontBackSplit(head, &a, &b); // a and b are two halves 3) Sort the two halves a and b.MergeSort(a);MergeSort(b);4) Merge the sorted a and b(using SortedMerge() discussed here)and update the head pointer using headRef.*headRef = SortedMerge(a, b);*/struct Node{int val;Node *next;Node(int _val) :val(_val), next(NULL){}};void FrontBackSplit(Node *head, Node **a, Node **b){if (head == NULL || head->next == NULL) return;Node *faster = head->next;Node *slower = head;while (faster && faster->next){slower = slower->next;faster = faster->next->next;}*b = slower->next;slower->next = NULL;*a = head;}Node *SortedMerge(Node *a, Node *b){if (a == NULL) return b;if (b == NULL) return a;Node *head = NULL;if (a->val < b->val){head = a;a = a->next;}else{head = b;b = b->next;}Node *pNext = head;while (a && b){if (a->val < b->val){pNext->next = a;a = a->next;}else{pNext->next = b;b = b->next;}pNext = pNext->next;}if (a) pNext->next = a;else pNext->next = b;return head;}void MergeSort(Node **head){if (!(*head) || !(*head)->next) return;Node *a = NULL, *b = NULL;FrontBackSplit(*head, &a, &b);MergeSort(&a);MergeSort(&b);*head = SortedMerge(a, b);}//main函数进行测试 int main(){Node *n1 = new Node(2);Node *n2 = new Node(1);Node *n3 = new Node(4);Node *n4 = new Node(3);Node *n5 = new Node(5);n1->next = n2;n2->next = n3;n3->next = n4;n4->next = n5;MergeSort(&n1);while (n1){cout << n1->val << " ";n1 = n1->next;}cout << endl;return 0;}
0 0
- 面试题76:单链表的归并排序
- 程序员面试题精选--归并排序
- [各种面试题] 链表归并排序
- (程序员面试题)归并排序
- 经典面试题分析之归并排序的实现(js实现)
- 剑指offer之面试题36:数组中的逆序对-归并排序的应用
- 将两个已排序的链表归并成一个链表(C++面试题)
- 数据结构-从归并排序到数组的逆序对数(微软面试题)
- C++ 归并排序算法的实现与改进(含笔试面试题)
- 面试题:冒泡排序,选择排序,插入排序,快速排序,归并排序,堆排序
- 基于visual Studio2013解决面试题之1405归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- 单链表的归并排序
- MongoDB基本操作
- POJ 1015 Jury Compromise【DP】
- 正则表达式
- javasScript正则表达式验证密码(必须含数字字符特殊符号,长度4-16位之间)
- centos6.7 安装redis 3.0.7
- 面试题76:单链表的归并排序
- Zookeeper原理
- 菜鸟成长记-打开PDF文件,可以左右滑动
- fatal error C1083: 无法打开包括文件:“atlapp.h”: No such file or directory
- Android的布局ViewStub
- c++ 中__declspec 的用法
- magento 计划任务
- (1,eval)('this')释义
- Qt基础: 信号和槽