标签:leetcode linklist mergesort 归并排序
Sort a linked list in O(n log n)
time using constant space complexity.
MergeSort对于链表的排序,实现了就地排序的同时,时间复杂度和空间复杂度都达到了基于比较的排序的最优值,因此归并排序是链表排序的最佳排序方式。
/** * 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==NULL || head->next==NULL) return head; ListNode* temp = head->next; int n = 0; while(temp!=NULL) { n++; temp = temp->next; } for(int i=1; i<n; i*=2) { ListNode* pre = head; ListNode* low = pre->next; while(low!=NULL) { ListNode* mid = low; for(int j=1;j<i;j++) { //说明当前剩余需要归并的元素少于所需元素,直接退出; if(mid==NULL) break; mid = mid->next; } //说明当前剩余需要归并的元素少于所需元素,直接退出; if(mid == NULL || mid->next == NULL) break; ListNode* end = mid->next; for(int j=1;j<i;j++) { if(end->next==NULL) break; end = end->next; } merge(pre,low,mid,end); low = pre->next; for(int j=1; j<=2*i; j++) { if(low == NULL) break; pre = low; low = low->next; } } } temp = head->next; ListNode* save; while(temp!=NULL && head->val > temp->val) { save = temp; temp = temp->next; } if(temp != head->next) { ListNode* temp_head = head->next; head->next = temp; save->next = head; head = temp_head; } return head; } void merge(ListNode* pre, ListNode* low, ListNode* mid, ListNode* end) { ListNode* end1 = mid->next; ListNode* low2 = mid->next; ListNode* t_pre = pre; ListNode* end2 = end->next; while(low!=end1 || low2!=end2) { if(low == end1) { t_pre->next = low2; low2 = low2->next; } else if(low2 == end2) { t_pre->next = low; low = low->next; } else if(low->val > low2->val) { t_pre->next = low2; low2 = low2->next; } else { t_pre->next = low; low = low->next; } t_pre = t_pre->next; } t_pre->next = end2; } };
标签:leetcode linklist mergesort 归并排序
原文地址:http://blog.csdn.net/shaya118/article/details/42742297