面试算法-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;
    }
}
相关推荐
czhaii2 小时前
GB2312简体中文编码表
单片机·算法
8Qi82 小时前
LeetCode 121 & 122:股票买卖问题(DP 对比题解)✅
算法·leetcode·职场和发展·动态规划
一只齐刘海的猫2 小时前
【Leetcode】 接雨水
java·算法·leetcode
南境十里·墨染春水2 小时前
讲讲移动语义
算法
西凉的悲伤3 小时前
Guava类库——Range连续区间
java·算法·guava
菜菜的顾清寒3 小时前
力扣HOT(100)54多维动态规划-最长公共子序列
算法·leetcode·动态规划
随意起个昵称3 小时前
线性dp-LIS题目3(合唱队形)
算法
小六学编程3 小时前
二分查找详解:从普通二分到左右边界
算法·c/c++
wayz113 小时前
Volume:PVO(百分比成交量震荡指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
毕竟是shy哥3 小时前
PromptHash:基于亲和提示协同学习的自适应哈希检索跨模态算法
学习·算法·哈希算法