sort list
来源:互联网 发布:张鲁农村淘宝网 编辑:程序博客网 时间:2024/06/11 12:37
题目如下:
Sort a linked list in O(n log n) time using constant space complexity.
nlogn的排序有快速排序、归并排序、堆排序。双向链表用快排比较适合,堆排序也可以用于链表,单向链表适合用归并排序。以下是用归并排序的代码:
#include "stdafx.h"#include<iostream>using namespace std;#include<assert.h>/*Sort a linked list in O(n log n) time using constant space complexity.*/struct ListNode{int val;ListNode* next;ListNode(int x):val(x),next(NULL){};};ListNode* merge(ListNode* left, ListNode* right){ListNode* p = NULL;ListNode* first = NULL;//取头结点if(left->val <= right->val){p = left;left = left->next;}else{p = right;right = right->next;}first = p;//依次插入,注意p = p->next;while(left != NULL && right != NULL){if(left->val <= right->val){p->next = left;left = left->next;}else{p->next = right;right = right->next;}p = p->next;}//链表的话不用一个一个赋值,因为指针本来就是链接好的if(left != NULL)p->next = left;elsep->next = right;//保证返回的是头结点return first;} ListNode *sortList(ListNode *head) { if(head == NULL || head->next == NULL)return head; else {//####&&&&特别的地方,怎么选取链表的中间结点,快慢指针的使用 ListNode *fast = head; ListNode *slow = head; while(fast->next != NULL && fast->next->next != NULL) { fast = fast->next->next; slow = slow->next; } fast = slow; slow = slow->next; fast->next = NULL; fast = sortList(head); slow = sortList(slow); return merge(fast, slow); } } void DestroyNodes(ListNode* pnode) { if(pnode != NULL) { ListNode* pnext = pnode->next; delete pnode; pnode = NULL; DestroyNodes(pnext); } } void Test(char* testName, ListNode* head) { if(testName !=NULL) cout<<testName<<" begins: "<<endl; ListNode* temp = sortList(head);; while(temp != NULL) { cout<<temp->val<<" "; temp = temp->next; } cout<<endl; } //4, 9, 3, 7, 1 ,10,13 void Test1() { ListNode* pnode1 = new ListNode(4); ListNode* pnode2 = new ListNode(9); ListNode* pnode3 = new ListNode(3); ListNode* pnode4 = new ListNode(7); ListNode* pnode5 = new ListNode(1); ListNode* pnode6 = new ListNode(10); ListNode* pnode7 = new ListNode(13); pnode1->next = pnode2; pnode2->next = pnode3; pnode3->next = pnode4; pnode4->next = pnode5; pnode5->next = pnode6; pnode6->next = pnode7; Test("Test1", pnode1); DestroyNodes(pnode1); }int main(void){Test1();}
0 0
- list sort
- list sort
- Sort List
- Sort List
- list - sort
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- cocos2d3.0 Scale9Sprite
- 监控集群的磁盘空间使用量,超阀值发送报警邮件
- C++中的抽象基类(Primer学习)
- map删除元素注意
- 一道面试题,内存受限的情况,如何在海量的数据中找到重复最多的
- sort list
- stop HyperV VM by WMI in powershell
- 为什么Field不能被重写?
- COALESCE / GREATEST / LEAST.
- hdu1394 Minimum Inversion Number
- java学习值swing编程 (二)
- linux命令之删除
- CSS Font
- 斜45度地图简介、坐标系转换以及数据碰撞