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(){}
};
//合并两个有序的list
LinkNode* 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;
}
//从中点断开成两个List
fast = 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;
}
//显示list
void 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);
}
1922

被折叠的 条评论
为什么被折叠?



