链表的排序 时间复杂度O(nlogn)
2015-03-30 22:29
288 查看
思路:用归并排序。对一个链表采用递归进行二等分,直到每个部分有序,然后对其进行合并。其实就是两步,先分解,然后合并有序链表。 代码: //对链表采用递归排序 class Solution { public: ListNode* sortList(ListNode* head){ if(head==NULL||head->next==NULL) return head; return mergeSort(head); } ListNode* mergeSort(ListNode* head){ //递归终止条件 if(head==NULL||head->next==NULL) return head; ListNode* p=head;ListNode* q=head;ListNode* prep=NULL; while (q!=NULL&&q->next!=NULL) { q=q->next->next; prep=p; p=p->next; } prep->next=NULL;//对链表进行切分 ListNode* lhalf=mergeSort(head); ListNode* rhalf=mergeSort(p); ListNode* res=merge(lhalf,rhalf); return res; } //合并两个有序链表 ListNode* merge(ListNode* lh,ListNode* rh){ ListNode* tempHead=new ListNode(0); ListNode* p=tempHead; while (lh&&rh) { if(lh->val<=rh->val){ p->next=lh; lh=lh->next; }else{ p->next=rh; rh=rh->next; } p=p->next; } if(lh==NULL) p->next=rh; else p->next=lh; p=tempHead->next; tempHead->next=NULL; delete tempHead; return p; } };
相关文章推荐
- leetcode之时间复杂度为O(nlogn)的链表排序
- LeetCode 148. Sort List--O(nlogn)时间复杂度和常数空间复杂度给链表排序
- 基于比较的排序,时间复杂度下界是o(nlogn)的小证明
- 单链表的归并排序:时间复杂度O(nlogn),空间复杂度O(1)
- 基于比较的排序,时间复杂度下界是o(nlogn)的证明
- O(nlogn)时间复杂度 链表排序
- 为什么比较排序时间复杂度是O(nlogN)
- C/C++ 数组,链表排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之归并排序
- LeetCode-Sort List,链表排序(插入和归并),时间复杂度O(n^2) and O(nlgn)
- 基于比较的排序,时间复杂度下界是o(nlogn)的小证明
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 对链表排序,时间开销O(nlogn), 空间开销O(1)
- 实现时间复杂度为O(nlogn)的链表排序算法
- 对链表排序 要求时间 复杂度为 O(nlogn) 空间复杂度为常量
- 删除链表结点--O(1)时间复杂度
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 删除链表中倒数第n个节点(时间复杂度为O(n))
- 删除链表结点(时间复杂度为O(1)))
- 常见排序的最好,平均以及最坏时间复杂度
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)