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

相关推荐
JieE21215 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack201 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术2 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦2 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050732 天前
(一)小红的数组操作
算法·编程语言
怕浪猫2 天前
Electron 系列文章封面图
算法·架构·前端框架