单链表的归并排序:时间复杂度O(nlogn),空间复杂度O(1)
2017-09-17 20:23
411 查看
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* sortList(ListNode* head) { if(!head||!head->next) return head; ListNode*pslow=head; ListNode*pfast=head->next; while(pfast&&pfast->next){ pslow=pslow->next; pfast=pfast->next->next; } ListNode*h2=pslow->next; pslow->next=NULL; ListNode*p1=sortList(head); ListNode*p2=sortList(h2); return mergeList(p1,p2); } ListNode* mergeList(ListNode* headA,ListNode*headB){ ListNode*newhead=new ListNode(0); ListNode*tail=newhead; while(headA&&headB){ if(headA->val<headB->val){ tail->next=headA; tail=headA; headA=headA->next; }else{ tail->next=headB; tail=headB; headB=headB->next; } } while(headA) { tail->next=headA; tail=headA; headA=headA->next; } while(headB) { tail->next=headB; tail=headB; headB=headB->next; } ListNode* rehead=newhead->next; delete newhead; return rehead; } };
相关文章推荐
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 二路归并排序,利用递归,时间复杂度o(nlgn)
- 归并排序及其时间复杂度分析
- 如何对n个大小都小于100的整数进行排序,要求时间复杂度O(n),空间复杂度O(1)。
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 基于比较的排序,时间复杂度下界是o(nlogn)的小证明
- 如何对n个大小都小于100的整数进行排序,要求时间复杂度O(n),空间复杂度O(1)。
- 为什么比较排序时间复杂度是O(nlogN)
- 归并排序及其时间复杂度分析
- 【编程题目】如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 链表的排序 时间复杂度O(nlogn)
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何对n个整数数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解
- C/C++ 数组排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之快速排序
- C/C++ 数组排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之希尔排序
- leetcode之时间复杂度为O(nlogn)的链表排序
- LeetCode 148. Sort List--O(nlogn)时间复杂度和常数空间复杂度给链表排序
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)