leetcode - Sort List

来源:互联网 发布:js页面加载时执行函数 编辑:程序博客网 时间:2024/05/16 05:48

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

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; *///时间复杂度O(nlogn),空间复杂度O(1),可以用归并排序来实现.//如果想实现归并排序,那么怎么确定list的中间的位置,可以假设两个指针p1,p2,且p2移动的距离是p1的两倍,那么当p2指向最后一个元素,p1指向中间.//通过上面的方法可以确定中间位置,然后利用归并解决问题。struct ListNode{int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {};};class Solution {private:ListNode *mergeSort(ListNode *head){if(head == NULL || head->next == NULL) return head;ListNode *first = head,*second = head;ListNode *mid = head;while(second != NULL && second->next != NULL){second = second->next->next;mid = first;first = first->next;}mid->next = NULL;return merge(mergeSort(head),mergeSort(first));}ListNode * merge(ListNode *la, ListNode *lb){ListNode *tmp = new ListNode(0);ListNode *p = tmp;while(la != NULL && lb != NULL){if(la->val <= lb->val){p->next = la;la = la->next;}else{p->next = lb;lb = lb->next;}p = p->next;}if(la != NULL) p->next = la;else if(lb != NULL) p->next = lb;ListNode *lc = tmp->next;delete tmp;return lc;}public:    ListNode *sortList(ListNode *head) {return mergeSort(head);    }};


0 0