[Leetcode]_148 Sort List

/**
 *  Index: 148
 *  Title: Sort List
 *  Author: ltree98
 **/

题意

将给定的链表排序,要求时间复杂度 O(nlogn) 空间复杂度O(1)


我的

思路

时间复杂度为O(nlogn)的排序,主流的也就快排和归并,但是归并空间复杂度不合格,所以就是快排。

此题麻烦点在于,这是一个链表,不像数组,可以直接高位低位。

但是,通过快慢指针,可以将链表一分为二。

然后,将各自部分排序,再合并。

时间复杂度:O(nlogn)
空间复杂度:O(1)

实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
private:
    ListNode* merge(ListNode* l1, ListNode* l2) {
        ListNode* preL1 = new ListNode(0);
        preL1->next = l1;
        ListNode* ori = preL1;
        
        while(l1 && l2) {
            if(l1->val <= l2->val)   {
                preL1 = l1;
                l1 = l1->next;
            }
            else    {
                preL1->next = l2;
                l2 = l2->next;
                
                preL1 = preL1->next;
                preL1->next = l1;
            }
        }
        
        if(l1 == NULL) {
            preL1->next = l2;
        }
        
        return ori->next;
    }
public:
    ListNode* sortList(ListNode* head) {
        if(head == NULL || head->next == NULL)
            return head;
        
        ListNode* slow = head;
        ListNode* fast = head->next;
        while(fast && fast->next)   {
            slow = slow->next;
            fast = fast->next->next;
        }
        
        ListNode* temp = slow;
        slow = slow->next;
        temp->next = NULL;
        
        ListNode* firstHalf = sortList(head);
        ListNode* secondHalf = sortList(slow);
        
        return merge(firstHalf, secondHalf);
    }
};

发布了472 篇原创文章 · 获赞 387 · 访问量 78万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览