力扣第147题-对链表进行插入排序

168 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

前言

力扣第147题 对链表进行插入排序 如下所示:

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

image.png

image.png

输入: head = [4,2,1,3]
输出: [1,2,3,4]

一、思路

题目的目标很明确:使用插入排序使得链表中的元素从左到右升序排列。值得注意的是,插入排序是一个原地改变引用的过程。

题目中关于 插入排序 的具体步骤已经分步骤写的很清楚了,这里就不重复解释了,直接看下面的图解流程

图解插入排序

这里以示例中的 head = [4,2,1,3] 作为例子,如下图所示:

目标是让链表中的元素从左到右为升序,绿色表示已排序好的元素

  1. 第一个元素无需排序

image.png

  1. 第二元素 2 < 4,故移动到第一个

image.png

  1. 同理,第三个元素 1 < 2 故需要移动到链表中的最前面

image.png

  1. 第四个元素 3 < 4,我们将 3 放到 4 的前面即可

image.png

综上所述,我们不难看处至少需要完成插入的这个动作是需要以下的几个指针的

  • preNode:指向插入位置的前一个节点
  • sortNode:已经排序好的最后一个元素
  • curNode:指向当前迭代的元素

二、实现

实现代码

实现中因为要考虑会移动元素到第一个的清空,所以我们需要一个空元素放到最前面。其余地方与思路中保持一致

public ListNode insertionSortList(ListNode head) {
    // 特殊情况
    if (head == null || head.next == null)
        return head;
    // 新的头节点
    ListNode newHead = new ListNode(0);
    newHead.next = head;
    ListNode curNode = head;
    while(curNode != null){
        // 插入的上一个位置
        ListNode prevNode = newHead;
        // 已排序好的元素
        ListNode sortNode = newHead.next;
        while(sortNode != null){
            if(curNode.val > sortNode.val){
                prevNode = sortNode;
                sortNode = sortNode.next;
            }else{
                break;
            }
        }
        // 下一个元素
        ListNode next = curNode.next;
        prevNode.next = curNode;
        curNode.next = sortNode;
        curNode = next;
    }
    return newHead.next;
}

测试代码

public static void main(String[] args) {
    ListNode list = new ListNode(4, new ListNode(2, new ListNode(1, new ListNode(3))));
    new Number148().insertionSortList(list);
}

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~