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;
        }
    };
  • 相关阅读:
    示例页面
    HDU2149Public Sale(Bash 博弈)
    留言板
    HDU2188Bash博弈
    win7系统激活工具
    HDU1849Rabbit and Grass(Nimm博弈)
    HDU1846Brave Game(巴什博弈)
    drools原生drl规则文件的使用
    Vue element table动态生成列
    eltable动态生成列重点
  • 原文地址:https://www.cnblogs.com/fightformylife/p/4379408.html
Copyright © 2011-2022 走看看