[LeetCode] Sort List

来源:互联网 发布:麻瓜网络 编辑:程序博客网 时间:2024/06/10 05:02

问题:

Sort a linked list in O(n log n) time using constant space complexity.

分析:

用divide and conquer。首先遍历一次,找到长度;然后遍历一半,找到中间点;然后在左右两半recursion,然后merge。

Time complexity: T(n) = 2T(n/2) + n = O(n log n)。

代码:

ListNode *mergeList(ListNode *left, ListNode *right) {ListNode dummy(0);ListNode *curr = &dummy;while (left || right) {if (!left) {curr->next = right;break;}if (!right) {curr->next = left;break;}int l = left->val;int r = right->val;if (l < r) {curr->next = left;left = left->next;curr = curr->next;}else {curr->next = right;right = right->next;curr = curr->next;}}return dummy.next;}class Solution {public:    ListNode *sortList(ListNode *head) {if (!head)return head;int n = 0;ListNode *curr = head;while (curr) {n ++;curr = curr->next;}if (n == 1)return head;int half = n / 2;curr = head;for (int i = 0; i < half; i ++) {curr = curr->next;}ListNode * right = curr->next;curr->next = NULL;ListNode * left = sortList(head);right = sortList(right);return mergeList(left, right);}};


0 0
原创粉丝点击