zoukankan      html  css  js  c++  java
  • 链表的排序 时间复杂度O(nlogn)

    思路:用归并排序。对一个链表采用递归进行二等分,直到每个部分有序,然后对其进行合并。其实就是两步,先分解,然后合并有序链表。
    代码:
    //对链表采用递归排序
    class Solution {
    public:
        ListNode* sortList(ListNode* head){
            if(head==NULL||head->next==NULL)
                return head;
            return mergeSort(head);
        }
        ListNode* mergeSort(ListNode* head){
            //递归终止条件
            if(head==NULL||head->next==NULL)
                return head;
            ListNode* p=head;ListNode* q=head;ListNode* prep=NULL;
            while (q!=NULL&&q->next!=NULL)
            {
                q=q->next->next;
                prep=p;
                p=p->next;
            }
            prep->next=NULL;//对链表进行切分
           
            ListNode* lhalf=mergeSort(head);
            ListNode* rhalf=mergeSort(p);
            ListNode* res=merge(lhalf,rhalf);
            return res;
        }
        //合并两个有序链表
        ListNode* merge(ListNode* lh,ListNode* rh){
            ListNode* tempHead=new ListNode(0);
            ListNode* p=tempHead;
            while (lh&&rh)
            {
                if(lh->val<=rh->val){
                    p->next=lh;
                    lh=lh->next;
                }else{
                    p->next=rh;
                    rh=rh->next;
                }
                p=p->next;
            }
            if(lh==NULL)
                p->next=rh;
            else
                p->next=lh;
            p=tempHead->next;
            tempHead->next=NULL;
            delete tempHead;
            return p;
        }
    };
  • 相关阅读:
    USDT与omniCore钱包
    C# 事件(第四章)
    委托进阶(第三章)
    委托入门(第二章)
    委托入门(第一章)
    asp.net页面生命周期
    在WEB程序中小心使用"ThreadStatic"
    如何在一个请求中共享数据或对象实例
    .net垃圾回收机制原理
    MVC模式简介
  • 原文地址:https://www.cnblogs.com/fightformylife/p/4379408.html
Copyright © 2011-2022 走看看