链表归并排序
2021-03-05 11:30
标签:空间 public write 复杂 链表 amp 使用 描述 class 题目描述 链表归并排序 标签:空间 public write 复杂 链表 amp 使用 描述 class 原文地址:https://www.cnblogs.com/lyr-2000/p/14323128.html
在O(n log n)的时间内使用常数级空间复杂度对链表进行排序。
示例1
输入
复制
{30,20,40}
返回值
复制
{20,30,40}
说明:本题目包含复杂数据结构ListNode,点此查看相关信息
#define null NULL
#define Node ListNode
class Solution {
public:
/**
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* sortList(ListNode* head) {
// write code here
if(head) return getMiddle(head);
return null;
}
// int len(Node* h) {
// int x=0;
// while(h)x++,h=h->next;
// return x;
// }
Node* getMiddle(ListNode* head) {
if(head==null||head->next==null) return head;
Node* first=head,*last=head,*pre=null;
while(first && first->next) first=first->next->next,pre = last, last=last->next;
pre->next=NULL;
Node* l = getMiddle(head);
Node* r = getMiddle(last);
return merge(l,r);
}
Node* merge(Node* l, Node* r) {
if(l==null) return r;
if(r==null) return l;
Node dummy(0);
Node* first = &dummy, *last = first;
while(l && r) {
if(l->val val) last->next = l,l=l->next,last=last->next,last->next=null;
else last->next=r,r=r->next,last = last->next,last->next=null;
}
if(l)last->next = l;
if(r)last->next=r;
return first->next;
}
};