题目描述:
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
题解:
O(n log n) 时间复杂度、O(1)的空间复杂度,自然想到的是归并排序。值得一提的是在找区间中点的时候,可以用快慢指针的方法一次遍历得到。
slow指针一次走一步,faster指针一次走两步。假设链表长度为N,当faster走向链表结尾的时候,需要N/2次,这个时候slow正好指向链表的中点。
AC代码:
class Solution { public: ListNode* sortList(ListNode* head) { ListNode* tmp = head; if(head == NULL || head->next == NULL) return head; // cut ListNode* slow = head; ListNode* faster = head; while(faster!=NULL) { faster =faster->next; if(faster == NULL) break; faster = faster->next; if(faster == NULL) break; slow = slow->next; } ListNode* r = slow->next; slow->next = NULL; ListNode* l = head; r = sortList(r); l = sortList(l); // merge ListNode* ans = new ListNode(-1); ListNode* pre = ans; while(r!=NULL && l!=NULL) { int val; if(r->val <= l->val) { val = r->val; r = r->next; } else { val = l->val; l = l->next; } tmp = new ListNode(val); tmp->next = pre->next; pre->next = tmp; pre = tmp; } if(r!=NULL) pre->next = r; if(l!=NULL) pre->next = l; return ans->next; } };