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;
}
};
相关文章推荐
- lintcode 173 链表插入排序
- python_lintcode_115不同的路径 II_112删除排序链表中的重复元素
- LintCode : 链表排序
- 链表排序 -lintcode
- LintCode-删除排序链表中的重复元素
- LintCode 合并两个排序链表
- LintCode-合并两个排序链表
- 【LintCode 简单】165. 合并两个排序链表
- 删除排序链表中的重复数字 II -LintCode
- lintcode 容易题 :Merge Two Sorted Lists合并两个排序链表
- LintCode 第165题 合并两个排序链表
- python_lintcode_93. 平衡二叉树_165. 合并两个排序链表_453. 将二叉树拆成链表
- lintcode 合并k个排序链表
- 【lintcode】——链表插入排序-Insertion Sort List
- LintCode-删除排序链表中的重复数字 II
- 112. 删除排序链表中的重复元素(remove-duplicates-from-sorted-list)(c++)----lintcode面试题之链表
- [LintCode] Sort List 链表排序
- LintCode(E) 链表插入排序
- lintcode--删除排序链表中的重复数字
- LintCode刷题阶段性总结---链表容易篇(翻转链表,删除链表重复元素,合并两个排序链表等)