美文网首页
148. 排序链表

148. 排序链表

作者: 薄荷糖的味道_fb40 | 来源:发表于2019-04-20 12:08 被阅读0次

    在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

    示例 1:

    输入: 4->2->1->3
    输出: 1->2->3->4

    示例 2:

    输入: -1->5->3->4->0
    输出: -1->0->3->4->5

    思路:

    由复杂度可想到归并排序,归并排序最重要的merge步骤在链表下可以实现O(1)的空间复杂度,具体实现如下。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* sortList(ListNode* head) {
            if(!head)
            {
                return nullptr;
            }
            int count=0;
            ListNode* p=head;
            while(p)
            {
                count++;
                p=p->next;
            }
            return sort(head,0,count-1);
        }
        ListNode* sort(ListNode* head,int start,int end)
        {
            if(start>=end)
            {
                return head; 
            }
            int mid=start+(end-start)/2;
            ListNode* left=head;
            ListNode* right=head;
            int count=0;
            while(count<mid-start)
            {
                right=right->next;
                count++;
            }
            ListNode* temp=right;
            right=right->next;
            temp->next=nullptr;
            ListNode* l1=sort(left,start,mid);
            ListNode* l2=sort(right,mid+1,end);
            return merge(l1,l2);
        }
        ListNode* merge(ListNode* l1,ListNode* l2)
        {
            ListNode* head=new ListNode(0);
            ListNode* p=head;
            while(l1 && l2)
            {
                if(l1->val<l2->val)
                {
                    p->next=l1;
                    l1=l1->next;
                }
                else
                {
                    p->next=l2;
                    l2=l2->next;
                }
                p=p->next;
            }
            if(l1)
            {
                p->next=l1;
            }
            if(l2)
            {
                p->next=l2;
            }
            return head->next;
        }
    };
    

    相关文章

      网友评论

          本文标题:148. 排序链表

          本文链接:https://www.haomeiwen.com/subject/ffbkgqtx.html