Sort List
Sort a linked list in O(n log n) time using constant space complexity.
要求时间复杂度为O(nlogn),那么不能用quickSort了(最坏O(n^2)),所以使用mergeSort.
通常写排序算法都是基于数组的,这题要求基于链表。所以需要自己设计函数获得middle元素,从而进行切分。
参考Linked List Cycle II中的快慢指针思想,从而可以获得middle元素。
/*** 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* head1 = head;ListNode* head2 = getMid(head);head1 = sortList(head1);head2 = sortList(head2);return merge(head1, head2);}ListNode* merge(ListNode* head1, ListNode* head2){ListNode* newhead = new ListNode(-1);ListNode* newtail = newhead;while(head1 != NULL && head2 != NULL){if(head1->val <= head2->val){newtail->next = head1;head1 = head1->next;}else{newtail->next = head2;head2 = head2->next;}newtail = newtail->next;newtail->next = NULL;}if(head1 != NULL)newtail->next = head1;if(head2 != NULL)newtail->next = head2;return newhead->next;}ListNode* getMid(ListNode* head){//guaranteed that at least two nodesListNode* fast = head->next;ListNode* slow = head->next;ListNode* prev = head;while(true){if(fast != NULL)fast = fast->next;elsebreak;if(fast != NULL)fast = fast->next;elsebreak;prev = slow;slow = slow->next;}prev->next = NULL; // cutreturn slow;} };