Sort a linked list in O(n log n) time using constant space complexity.
链表,快慢指针找中点,归并排序。
注意判断条件fast->next!=NULL&&fast->next->next!=NULL,若为fast!=NULL&&fast->next!=NULL则会出现内存溢出
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *sortList(ListNode *head) { 12 if(head==NULL || head->next==NULL) 13 return head; 14 ListNode* slow, *fast; 15 slow=head; 16 fast=head; 17 while(fast->next!=NULL&&fast->next->next!=NULL){ 18 slow=slow->next; 19 fast=fast->next->next; 20 } 21 fast=slow; 22 slow=slow->next; 23 fast->next=NULL; 24 fast=sortList(head); 25 slow=sortList(slow); 26 return merge(fast,slow); 27 28 } 29 ListNode *merge(ListNode *left, ListNode *right){ 30 ListNode *res,*temp; 31 if(left==NULL){ 32 res=right; 33 return res; 34 } 35 if(right==NULL){ 36 res=left; 37 return res; 38 } 39 if(left->val<=right->val){ 40 res=left; 41 left=left->next; 42 }else{ 43 res=right; 44 right=right->next; 45 } 46 temp=res; 47 while(left!=NULL&&right!=NULL){ 48 if(left->val<=right->val){ 49 temp->next=left; 50 left=left->next; 51 }else{ 52 temp->next=right; 53 right=right->next; 54 } 55 temp=temp->next; 56 57 } 58 if(left!=NULL){ 59 temp->next=left; 60 } 61 if(right!=NULL){ 62 temp->next=right; 63 } 64 return res; 65 } 66 };