Sort List

来源:互联网 发布:部落冲突女巫数据 编辑:程序博客网 时间:2024/06/14 13:05

Sort a linked list in O(nlogn) time using constant space complexity.

思路:要求常数空间,并且时间复杂度o(nlogn).可以采用归并排序。

#include <iostream>using namespace std;struct LinkNode{int data;LinkNode *next;LinkNode(int x):data(x),next(){}};//合并两个有序的listLinkNode* mergeTwoList(LinkNode *l1,LinkNode *l2){LinkNode *p1 = l1,*p2 = l2,*head,*pre;LinkNode *dummy = new LinkNode(-1);pre = dummy;while(p1!=NULL && p2!=NULL){if(p1->data < p2->data){pre->next = p1;p1 = p1->next;}else{pre->next = p2;p2 = p2->next;}pre = pre->next;}if(p1!=NULL){pre->next = p1;}if(p2!=NULL){pre->next = p2;}head = dummy->next;delete dummy;return head;}//要求常数空间,并且时间复杂度o(nlogn).可以采用归并排序。LinkNode *sortList(LinkNode *head){if(head==NULL || head->next == NULL) return head;//找到链表的中点。这里可以用快慢指针的方法。LinkNode *fast =head,*slow = head;while(fast->next !=NULL && fast->next->next!=NULL){fast = fast->next->next;slow = slow->next;}//从中点断开成两个Listfast = slow;slow = slow->next;fast->next = NULL;LinkNode *l1 = sortList(head);//递归,左半部分有序LinkNode *l2 = sortList(slow);//递归,右半部分有序return mergeTwoList(l1,l2);//合并}//对链表初始化LinkNode *initLink(LinkNode *dummy,int array[],int len){LinkNode *head,*tmp;//dummy表示哑节点,head一般表示头指针,它指向第一个节点。tmp = dummy;//用尾插法for(int i = 0;i < len;i++){LinkNode *p = new LinkNode(array[i]);tmp->next = p;tmp = tmp->next;}head = dummy->next;delete dummy;return head;}//显示listvoid showList(LinkNode *head){while(head){printf("%d ",head->data);head = head->next;}printf("\n");}//摧毁链表void destroyList(LinkNode *head){LinkNode *dummy = new LinkNode(-1);dummy->next = head;LinkNode *pre,*cur,*tmp;pre = dummy;cur = pre->next;while(cur){tmp = cur->next;pre->next = tmp;delete cur;cur = tmp;}delete dummy;printf("The list has been destroyed!\n");}void main(){LinkNode *dummy1 = new LinkNode(-1);int array1[] = {2,5,1,4,8,12,43,56,15,89,65,120,44,38};int len1 = sizeof(array1)/sizeof(int);LinkNode *head1 = initLink(dummy1,array1,len1);showList(head1);head1 = sortList(head1);showList(head1);destroyList(head1);}


0 0
原创粉丝点击