• leetcode刷题笔记一百四十七题 对链表进行插入排序


    leetcode刷题笔记一百四十七题 对链表进行插入排序

    源地址:147. 对链表进行插入排序

    问题描述:

    对链表进行插入排序。

    插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
    每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

    插入排序算法:

    插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
    每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
    重复直到所有输入数据插入完为止。

    示例 1:

    输入: 4->2->1->3
    输出: 1->2->3->4
    示例 2:

    输入: -1->5->3->4->0
    输出: -1->0->3->4->5

    //本题使用带哨兵的双指针法
    //由于不确定head所处的位置即为其在有序链表中的位置,所以需要使用一个标记头部的哨兵
    //对原先有序部分跳过,对无序部分重建链
    /**
     * Definition for singly-linked list.
     * class ListNode(var _x: Int = 0) {
     *   var next: ListNode = null
     *   var x: Int = _x
     * }
     */
    
    object Solution {
        def insertionSortList(head: ListNode): ListNode = {
            if (head == null || head.next == null) return head
    
            val dummy = ListNode(Int.MinValue)
            var pre = head
            var cur = head.next
            dummy.next = head
    
            while (cur != null){
                if (pre.x <= cur.x){
                    pre = cur
                    cur = cur.next
                }
                else{
                    var p = dummy
                    while (p.next != cur && p.next.x < cur.x){
                        p = p.next
                    }
                    pre.next = cur.next
                    cur.next = p.next
                    p.next = cur
                    cur = pre.next
                }
            }
            return dummy.next
        }
    }
    
  • 相关阅读:
    Mutex和RWMutex
    内核态和用户态
    runtime源码
    goroutine的结束与通信
    进程线程协程
    堆和栈
    array和slice区别
    逃逸分析
    单例模式
    WaitGroup用法
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13577196.html
Copyright © 2020-2023  润新知