Sort List (Medium)
Description
Sort a linked list in O(n log n) time using constant space complexity.
Analysis
对单向链表进行排序,时间复杂度为nlogn,其中快排,堆排序,合并排序都可以达到这个复杂度。而快排不太适合单向链表。我们可以用合并排序来实现。
My Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
* 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; else { ListNode *p = head,*mid = head, *tmp=head; while(tmp->next != NULL && tmp->next->next != NULL) { tmp = tmp->next->next; mid = mid->next; } tmp = mid; mid = mid->next; tmp->next = NULL; tmp = sortList(p); mid = sortList(mid); return listmerge(tmp,mid); } } ListNode *listmerge(ListNode *head1, ListNode *head2) { if(head1 == NULL) return head2; if(head2 == NULL) return head1; ListNode *head=NULL , *p ; if(head1->val < head2->val) { head = head1; head1 = head1->next; } else { head = head2; head2 = head2->next; } p = head;
while(head1 != NULL && head2 != NULL) { if(head1->val < head2->val) { p->next = head1; head1 = head1->next; } else { p->next = head2; head2 = head2->next; } p = p->next; } while(head1 != NULL) { p->next = head1; head1 = head1->next; p = p->next; } while(head2 != NULL) { p->next = head2; head2 = head2->next; p = p->next; } p->next = NULL; return head; } };
|