面试算法-103-对链表进行插入排序

题目

给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。

插入排序 算法的步骤:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。

每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。

重复直到所有输入数据插入完为止。

下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

对链表进行插入排序。

示例 1:

输入: head = 4,2,1,3

输出: 1,2,3,4

java 复制代码
class Solution {
    public ListNode insertionSortList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode dummy = new ListNode(0);
        dummy.next = head;

        ListNode p1 = dummy;

        while (p1.next != null) {
            ListNode p2 = p1;
            int min = Integer.MAX_VALUE;
            ListNode minPre = null;
            while (p2.next != null) {
                if (p2.next.val < min) {
                    min = p2.next.val;
                    minPre = p2;
                }
                p2 = p2.next;
            }

            ListNode minNode = minPre.next;
            if (minNode != null) {
                minPre.next = minNode.next;

                ListNode temp = p1.next;
                p1.next = minNode;
                minNode.next = temp;
            }
            p1 = p1.next;
        }
        return dummy.next;
    }
}
相关推荐
YH55269841 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
遥感知识服务3 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶3 小时前
1-13-TimSort
算法
Rain的Java大神之路3 小时前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
ZJU_统一阿萨姆3 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
叩码以求索5 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
官乐6 小时前
AI面试指南(多agent开发流程)
人工智能·面试·职场和发展
北风toto6 小时前
中缀、前缀、后缀表达式
算法·软件设计师
听取WA声一片(无恶意)6 小时前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
码匠许师傅6 小时前
【C++ 面试真题】27. 聊聊 C++ 的内存泄漏与内存布局
java·c++·面试