LeetCode 148. 排序链表

问题描述:

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

示例:

示例 1:

复制代码
输入:head = [4,2,1,3]
输出:[1,2,3,4]

示例 2:

复制代码
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]

示例 3:

复制代码
输入:head = []
输出:[]

提示:

  • 链表中节点的数目在范围 [0, 5 * 104]
  • -105 <= Node.val <= 105

上代码,拿去即可运行:

java 复制代码
package onlyqi.daydayupgo06.test;

import java.util.Objects;

public class Solution {

    public static void main(String[] args) {
        // 2---1----3---5---4
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5, listNode4);
        ListNode listNode3 = new ListNode(3, listNode5);
        ListNode listNode1 = new ListNode(1, listNode3);
        ListNode listNode2 = new ListNode(2, listNode1);
//        while (listNode2 != null) {
//            System.out.print(listNode2.val+"   ");
//            listNode2 = listNode2.next;
//        }
        System.out.println("===========================================================");
        ListNode resultNode = sortList(listNode2);
        while (resultNode != null) {
            System.out.print(resultNode.val + "   ");
            resultNode = resultNode.next;
        }

    }

    public static ListNode sortList(ListNode head) {
        // 基础边界检查
        if (head == null || head.next == null) {
            return head;
        }
        ListNode resultNode = head;
        ListNode next = head.next;
        resultNode.next = null;

        while (!Objects.isNull(next)) {
            ListNode temp = next;
            next = next.next;

            if (temp.val < resultNode.val) {
                temp.next = resultNode;
                resultNode = temp;
            } else {
                ListNode curr = resultNode;
                while (curr.next != null && curr.next.val < temp.val) {
                    curr = curr.next;
                }
                temp.next = curr.next;
                curr.next = temp;
            }
        }
        return resultNode;
    }













//    public static ListNode sortList(ListNode head) {
//        // 基础边界检查
//        if (head == null || head.next == null) {
//            return head;
//        }
//        // resultNode 始终指向已排序部分的头节点
//        ListNode resultNode = head;
//        // next 指向待排序的下一个节点
//        ListNode next = head.next;
//        // 初始化:第一个节点已经算作排好序了,先断开它与后面的连接
//        resultNode.next = null;
//        while (next != null) {
//            // 1. 重要:提前保存下一个待排序节点,防止 temp.next 被修改后断链
//            ListNode temp = next;
//            next = next.next;
//            // 2. 情况一:temp 应该插入到排好序部分的【头部】(作为新的头)
//            if (temp.val <= resultNode.val) {
//                temp.next = resultNode;
//                resultNode = temp;
//            } else {
//                // 情况二:temp 应该插入到排好序部分的【中间或尾部】
//                ListNode current = resultNode;
//                // 寻找插入位置:找到第一个值大于 temp 的节点,或者到结尾
//                while (current.next != null && current.next.val < temp.val) {
//                    current = current.next;
//                }
//                // 将 temp 插入到 current 之后
//                temp.next = current.next;
//                current.next = temp;
//            }
//        }
//        return resultNode;
//    }


    public static class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }


}

运行结果:

我要刷300道算法题,第147道 。 尽快刷到200,每天搞一道 。

相关推荐
Dola_Zou5 小时前
工厂智能排产软件算法保护与按产线计费实战
算法·自动化·软件工程·软件加密
啦啦啦啦啦zzzz7 小时前
Logger的组装(c++20)
c++·算法·c++20
尾善爱看海8 小时前
前端算法与手写题集
前端·算法
程序员阿鹏8 小时前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
AI 思录9 小时前
Prompt 事故档案(八):日常表达被标为“待校准”,AI 的爹味语法从哪里来
大数据·人工智能·算法·prompt·用户体验·ai合规
月光船幽幽9 小时前
跨范式映射的稳定接口设计
人工智能·python·算法
2601_9657422210 小时前
全媒体运营与短视频代运营,两者有什么区别?
大数据·数据结构·人工智能·算法·ai·媒体
wordbaby11 小时前
混合检索:两全其美的艺术
人工智能·算法
彧azz12 小时前
数据结构:关于图的学习
c语言·数据结构·笔记·学习·算法
热心网友俣先生12 小时前
A题-药材的烘干问题-题意逐句翻译
算法·数学建模