链表算法面试题---链表的插入排序

题目描述

给定一个链表,请用插入排序的方法,对链表完成排序。

插入排序

插入排序是一种稳定性排序,其主要思想就是把一个元素插入到一个已经排序好的数组中,整个过程就是一个元素找合适的插入位置,有点像打扑克牌的抓牌过程,抓一张牌然后插入到手上一堆牌中的合适位置。

链表的插入排序

链表插入排序的思路和普通数组的方式一样,我们让sortNode始终指向已经完成排序节点的最后一个位置,让insertNode始终指向待插入节点的位置,由于是插入排序,所以每次我们必须从头节点开始遍历,确认insertNode节点应该插入的位置,最后完成插入,并让sortNode和insertNode同时后移一位,继续遍历即可。

代码实现

    public ListNode insertSortList(ListNode head) {
        ListNode dummy = new ListNode();
        dummy.next = head;
        //指向已经完成排序节点的最后一个位置,初始为头节点
        ListNode sortNode = head;
        //指向待插入节点的位置,初始为第2个节点
        ListNode insertNode = head.next;
        while (insertNode != null) {
            //如果待插入节点的值大于等于已经排序节点的值,则不用插入
            if (insertNode.val >= sortNode.val) {
                sortNode = sortNode.next;
            } else {
                //从头节点开始遍历,找到insertNode合适的位置
                ListNode pre = dummy;
                while(pre.next.val <= insertNode.val){
                    pre = pre.next;
                }
                //找到位置后完成插入
                sortNode.next = insertNode.next;
                insertNode.next = pre.next;
                pre.next = insertNode;
            }
            insertNode = sortNode.next;
        }
        return dummy.next;
    }

图解过程

初始状态
在这里插入图片描述
insertNode.val 小于 sortNode.val,走else逻辑

ListNode pre = dummy;

在这里插入图片描述

sortNode.next = insertNode.next;
insertNode.next = pre.next;
pre.next = insertNode;

在这里插入图片描述

insertNode = sortNode.next;

在这里插入图片描述

第一次插入完成,重新排列一下。
在这里插入图片描述

第二次插入时,insertNode.val >= sortNode.val

所以不用插入,直接把sortNode和insertNode分别向右移动一位

sortNode = sortNode.next;
insertNode = sortNode.next;
在这里插入图片描述

第三次插入,重复第一次插入的流程
在这里插入图片描述
第三次插入完成,效果如下,继续按照此流程,最后完成整个链表的插入排序
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码拉松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值