【LeetCode】148. Sort List
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 nodes ListNode* fast = head->next; ListNode* slow = head->next; ListNode* prev = head; while(true) { if(fast != NULL) fast = fast->next; else break; if(fast != NULL) fast = fast->next; else break; prev = slow; slow = slow->next; } prev->next = NULL; // cut return slow; } };