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,每天搞一道 。

相关推荐
我是咸鱼不闲呀2 分钟前
力扣Hot100系列21(Java)——[多维动态规划]总结(不同路径,最小路径和,最长回文子串,最长公共子序列, 编辑距离)
java·leetcode·动态规划
lihao lihao6 分钟前
二分查找
java·数据结构·算法
WolfGang0073218 分钟前
代码随想录算法训练营 Day15 | 二叉树 part05
数据结构·算法
sheeta19988 分钟前
LeetCode 每日一题笔记 2025.03.20 3567.子矩阵的最小绝对差
笔记·leetcode·矩阵
代码栈上的思考8 分钟前
消息队列持久化:文件存储设计与实现全解析
java·前端·算法
qq_4176950519 分钟前
内存对齐与缓存友好设计
开发语言·c++·算法
2301_8166512219 分钟前
实时系统下的C++编程
开发语言·c++·算法
2401_8318249620 分钟前
C++与Python混合编程实战
开发语言·c++·算法
2301_8166512228 分钟前
C++中的策略模式高级应用
开发语言·c++·算法