您的位置:首页 > 其它

lintcode链表排序

2017-09-20 22:53 323 查看


链表排序 

 描述
 笔记

 数据

 评测

在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。

您在真实的面试中是否遇到过这个题? 

Yes

样例

给出 
1->3->2->null
,给它排序变成 
1->2->3->null
.

挑战 

分别用归并排序和快速排序做一遍。

标签 

链表

相关题目 

分析:对于O(n log n)
时间复杂度,满足条件的有归并排序、快速排序、堆排序,而常数级的空间复杂度则堆排序不满足条件,所以选用快排和归并排序。

对于快排:
选定两个指针,一个基准数。因为这是链表不是数组,所以两个指针都从链表头位置开始。指针pMov向右移动过程中,遇到大于等于基准数的元素不动,继续右移;遇到小于基准数的元素,指针pBeg开始向右移动,因为此时pBeg指向的元素一定大于等于基准数的,所以和pMov所指元素交换。经过一趟排序,分为两个部分。然后再对两部分分别重复,直至排序完成

/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/

class Solution {
public:
/*
* @param head: The head of linked list.
* @return: You should return the head of the sorted linked list, using constant space complexity.
*/
ListNode * sortList(ListNode * head) {
// write your code here
ListNode *tail=NULL;
Quick_Sort(head,tail);
return head;

}
void Quick_Sort(ListNode *head,ListNode *tail)//用两个指针
{
if((head==tail)||(head->next==NULL))
return;
ListNode *middle=Fun(head,tail);
Quick_Sort(head,middle);
Quick_Sort(middle->next,tail);
}
ListNode* Fun(ListNode *head,ListNode *tail)
{
if((head==tail)||(head->next==NULL))
return head;
int mid=head->val;
ListNode *pBeg=head,*pMov=head;
while(pMov!=tail)
{
if(pMov->val<mid)
{
pBeg=pBeg->next;
swap(pBeg->val,pMov->val);

}
pMov=pMov->next;
}
swap(head->val,pBeg->val);//pBeg指的一定是小于基准
return pBeg;
}
void swap(int &a,int &b)//注意有雷
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
};


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表排序