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
原创粉丝点击