Leetcode 148 排序链表

题目描述:

  在 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;
        
    }
};

 

posted @ 2020-03-25 09:46  猪突猛进!!!  阅读(96)  评论(0编辑  收藏  举报