zoukankan      html  css  js  c++  java
  • 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
        }
    }
    
  • 相关阅读:
    Wannafly挑战赛21A
    luoguP4000 斐波那契数列
    关于斐波那契数模意义下的循环节问题
    Codeforces Round #501 (Div. 3) F. Bracket Substring
    1257: [CQOI2007]余数之和
    51nod1380 夹克老爷的逢三抽一
    51nod1423 最大二"货" 单调栈
    51nod1624 取余最长路 前缀和 + set
    51nod1437 迈克步 单调栈
    51nod1515 明辨是非 并查集 + set
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13577196.html
Copyright © 2011-2022 走看看