当前位置: 首页 > news >正文

【leetcode】Sort List (middle)

Sort a linked list in O(n log n) time using constant space complexity.

 

思路:

用归并排序。设输入链表为S,则先将其拆分为前半部分链表A,后半部分链表B。注意,要把A链表的末尾置为NULL。即要把链表划分为两个独立的部分,防止后面错乱。

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode *sortList(ListNode *head) {
        if(head == NULL) return NULL;
        ListNode * p = head;
        int n = 1;
        while(p->next != NULL){n++; p = p->next;}
        return MergeSort(head, n);
    }

    ListNode * MergeSort(ListNode * head, int n)
    {
        if(n == 0)
            return NULL;
        else if(n == 1)
        {
            return head;
        }
        else
        {
            int m = n / 2;
            //下面这种划分的方法很挫 应用后面大神的方法
            ListNode * headb = head; 
            ListNode * p = NULL;
            int k = 1;
            while(k < m + 1)
            {
                p = headb;
                headb = headb->next;
                k++;
            }
            p->next = NULL;


            ListNode * A = MergeSort(head, m);    
            ListNode * B = MergeSort(headb, n - m);
            return Merge(A, B);
        }
    }

    ListNode * Merge(ListNode * A, ListNode * B)
    {
        ListNode * C, * head;
        if(A->val < B->val)
        {
            C = A; A = A->next;
        }
        else
        {
            C = B; B = B->next;
        }
        head = C;

        while(A != NULL && B != NULL)
        {
            if(A->val < B->val)
            {
                C->next = A; A = A->next;
            }
            else
            {
                C->next = B; B = B->next;
            }
            C = C->next;
        }

        if(A != NULL)
        {
            C->next = A;
        }
        else
        {
            C->next = B;
        }
        return head;
    }

    void createList(ListNode * &head)
    {
        int n;
        cin >> n;
        if(n != 0)
        {
            head = new ListNode(n);
            createList(head->next);
        }
    }
};

int main()
{
    Solution s;
    ListNode * L = NULL;
    s.createList(L);

    ListNode * LS = s.sortList(L);

    return 0;
}

 

大神精简版代码,关键注意划分过程

ListNode *sortList(ListNode *head) {
    if (head == NULL || head->next == NULL)
        return head;

    // find the middle place
    ListNode *p1 = head;
    ListNode *p2 = head->next;
    while(p2 && p2->next) {
        p1 = p1->next;
        p2 = p2->next->next;
    }
    p2 = p1->next;
    p1->next = NULL;

    return mergeList(sortList(head), sortList(p2));
}

ListNode *mergeList(ListNode* pHead1, ListNode* pHead2) {
    if (NULL == pHead1)
        return pHead2;
    else if (NULL == pHead2)
        return pHead1;

    ListNode* pMergedHead = NULL;

    if(pHead1->val < pHead2->val)
    {
        pMergedHead = pHead1;
        pMergedHead->next = mergeList(pHead1->next, pHead2);
    }
    else
    {
        pMergedHead = pHead2;
        pMergedHead->next = mergeList(pHead1, pHead2->next);
    }

    return pMergedHead;
}

 

相关文章:

  • 模拟叫号系统
  • LINUX下如何开启FTP服务器
  • shell脚本中把txt文件中空格换成,逗号
  • 【问底】徐汉彬:Web系统大规模并发——电商秒杀与抢购
  • Java 中反射机制的深入研究
  • 从头开始学JavaScript (十二)——Array类型
  • FrameLayout的作用
  • 解决git push远程分支错误
  • Ubuntu 终端命令整理
  • 算法模板——线段树5(区间开根+区间求和)
  • 在Apache下开启SSI配置
  • PHP 文件上传功能
  • Ngnice-国内ng学习网站
  • 【Java】使用动态代理与包装模式实现连接池
  • 关于exp/imp的总结学习
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • avalon2.2的VM生成过程
  • AWS实战 - 利用IAM对S3做访问控制
  • gf框架之分页模块(五) - 自定义分页
  • java2019面试题北京
  • Javascript 原型链
  • Java-详解HashMap
  • js递归,无限分级树形折叠菜单
  • mysql中InnoDB引擎中页的概念
  • npx命令介绍
  • Vue小说阅读器(仿追书神器)
  • Zepto.js源码学习之二
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 问题之ssh中Host key verification failed的解决
  • # 透过事物看本质的能力怎么培养?
  • #微信小程序:微信小程序常见的配置传值
  • $NOIp2018$劝退记
  • (1)STL算法之遍历容器
  • (2)STM32单片机上位机
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [Android]竖直滑动选择器WheelView的实现
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [BIZ] - 1.金融交易系统特点
  • [CSS]文字旁边的竖线以及布局知识
  • [Java基础]—JDBC
  • [oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算
  • [RK3568][Android12.0]--- 系统自带预置第三方APK方法
  • [vue3] 使用 vite 创建vue3项目的详细流程
  • [VulnHub靶机渗透]:billu_b0x 快速通关
  • [工业自动化-11]:西门子S7-15xxx编程 - PLC从站 - 分布式IO从站/从机
  • [蓝桥杯 2023 省 A] 平方差
  • [洛谷1156]垃圾陷阱(DP)
  • [每日一点]msgsnd函数代码跟踪