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

【LeetCode】【算法】148. 排序链表

LeetCode 148. 排序链表

题目

给你链表的头结点head,请将其按升序排列并返回排序后的链表。

思路

思路:归并排序
第一步:切左右,使用快慢指针找到中间节点
第二步:排左右,根据上面找到的中间节点,左右两个链表作为参数递归调用排序方法
第三步:while(leftNode!=null&&rightNode!=null)判断左右链表的结果,进行归并排序
第四步:对于leftNode!=null / rightNode!=null,把不为空的节点接到排好序的链表后面

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        // 归并排序

        // 返回条件
        if (head == null) return head;
        if (head != null && head.next == null) return head;

        // 切左右
        ListNode prevSlowNode = head;
        ListNode slowNode = head;
        ListNode fastNode = head;
        while (fastNode != null && fastNode.next != null) {
            prevSlowNode = slowNode;
            slowNode = slowNode.next;
            fastNode = fastNode.next.next;
        }
        prevSlowNode.next = null;

        // 排左右
        ListNode leftNode = sortList(head); // 排左边
        ListNode rightNode = sortList(slowNode); // 排右边

        // 左右归并排序
        ListNode result = new ListNode(); // dummy head
        ListNode cur = result;
        while (leftNode != null && rightNode != null) {
            if (leftNode.val < rightNode.val){
                cur.next = leftNode;
                leftNode = leftNode.next;
            } else {
                cur.next = rightNode;
                rightNode = rightNode.next;
            }
            cur = cur.next;
            cur.next = null;
        }
        if (leftNode != null){
            cur.next = leftNode;
        }
        if (rightNode != null){
            cur.next = rightNode;
        }

        return result.next;
    }
}

http://www.kler.cn/a/384015.html

相关文章:

  • Linux挖矿病毒(kswapd0进程使cpu爆满)
  • 数据结构之二叉树前序,中序,后序习题分析(递归图)
  • 基于Java的简单图书管理系统的实现(增删改查)
  • RabbitMQ 管理平台(控制中心)的介绍
  • 第十九周机器学习笔记:GAN的数学理论知识与实际应用的操作
  • 【种完麦子,我就往南走,去西双版纳,过个冬天!】
  • 后端开发面试题10(附答案)
  • c++bind绑定器--通俗易懂
  • 【大模型系列】Grounded-VideoLLM(2024.10)
  • 《深入理解拷贝构造函数:对象复制的核心机制》
  • Java ssm 基于微信小程序的民宿预订管理系统
  • VBA10-处理Excel的动态数据区域
  • 241107-离线环境下RHEL通过Python配置BerkeleyDB数据库
  • 一七六、CSS 介绍及示例
  • Flutter PC端UI组件库
  • 以太网交换安全:MAC地址漂移
  • C++——完美转发(引用折叠+forward)
  • wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器
  • 音频3A一——webrtc源码3A的启用方法和具体流程
  • runnable和callable区别和底层原理
  • Open API生成前端接口
  • 力扣——单值二叉树(C语言)
  • 蓝桥杯 区间移位--二分、枚举
  • CSS定位装饰
  • ASPICE框架下的高效汽车软件开发实践与优化策略
  • 实战技巧:深入Air780E的WebSocket应用