lintcode刷题系列:链表排序----归并排序 递归
2017-07-19 15:51
274 查看
归并排序的时间O(nlgn)
1>找到链表的中间值;
2>合并两个有序的链表;
ListNode* Sort(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 *pHead, *qHead, *pre;
pHead = qHead = head;
pre = NULL;
while(qHead!=NULL || qHead->next!=NULL) {
qHead = qHead->next->next;
pre = pHead;
pHead = pHead->next;
}
pre->next = NULL; //分裂成两个独立的链表
ListNode *l, *r;
l = mergesort(head);
r = mergesort(pHead);
return merge(l, r); //合并
}
ListNode* merge(ListNode* l, ListNode *r) {
ListNode *res = (ListNode*)malloc(sizeof(ListNode));
ListNode *temp = res;
while(l!=NULL && r!=NULL) {
if(l->val < r->val) {
temp->next = l;
temp = temp->next;
l = l->next;
} else {
temp->next = r;
temp = temp->next;
r = r->next;
}
}
if(l!=NULL) {
temp->next = ;
} else if (r!=NULL) {
temp->next = r;
}
temp = res->next;
free(res);
return temp;
}
1>找到链表的中间值;
2>合并两个有序的链表;
ListNode* Sort(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 *pHead, *qHead, *pre;
pHead = qHead = head;
pre = NULL;
while(qHead!=NULL || qHead->next!=NULL) {
qHead = qHead->next->next;
pre = pHead;
pHead = pHead->next;
}
pre->next = NULL; //分裂成两个独立的链表
ListNode *l, *r;
l = mergesort(head);
r = mergesort(pHead);
return merge(l, r); //合并
}
ListNode* merge(ListNode* l, ListNode *r) {
ListNode *res = (ListNode*)malloc(sizeof(ListNode));
ListNode *temp = res;
while(l!=NULL && r!=NULL) {
if(l->val < r->val) {
temp->next = l;
temp = temp->next;
l = l->next;
} else {
temp->next = r;
temp = temp->next;
r = r->next;
}
}
if(l!=NULL) {
temp->next = ;
} else if (r!=NULL) {
temp->next = r;
}
temp = res->next;
free(res);
return temp;
}
相关文章推荐
- LintCode刷题系列:数组排序--归并排序 递归
- 链表插入排序、链表归并排序
- 用归并排序对链表进行排序
- 单链表的排序 快速排序 归并排序 quicksort mergesort
- 【各种排序系列之】归并排序
- 面试之路(29)-合并两个排序的链表(递归和非递归)
- 微软面试题系列(一):把二元查找树转变成排序的双向链表
- 归并排序(O(n)辅助空间)与原地递归排序(O(1)辅助空间)
- 链表排序(归并排序)
- 剑指offer面试题25:合并两个排序的链表(c++ 递归+非递归)
- 排序系列之-归并排序
- 无聊写排序之 ---- 归并排序(MergeSort) 递归实现
- 快速排序、归并排序的递归、非递归实现
- 合并两个排序的链表(非递归)
- 算法系列—自顶向下归并排序(递归)
- Sort List (使用归并排序的链表排序)
- 排序总结系列六:归并排序
- 单链表排序----快排 & 归并排序
- 链表排序-归并排序和快速排序
- 链表排序---由底至顶的归并排序更优雅