zoukankan      html  css  js  c++  java
  • [LeetCode] 147. Insertion Sort List

    Given the head of a singly linked list, sort the list using insertion sort, and return the sorted list's head.

    The steps of the insertion sort algorithm:

    1. Insertion sort iterates, consuming one input element each repetition and growing a sorted output list.
    2. At each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list and inserts it there.
    3. It repeats until no input elements remain.

    The following is a graphical example of the insertion sort algorithm. The partially sorted list (black) initially contains only the first element in the list. One element (red) is removed from the input data and inserted in-place into the sorted list with each iteration.

    对链表进行插入排序。

    插入排序算法:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/insertion-sort-list
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题目就是题意,将一个乱序的 linked list 通过插入排序的方式重新排序。

    这道题不涉及算法,就是按照插入排序的思路将链表排序。当遍历链表的时候,你需要看每两个 node 之间是不是满足后一个 node.val >= 前一个 node.val,如果不满足,就需要将后一个 node 提出来,再从链表的头节点开始一个个遍历,最终放到合适的位置上去。其余解释请参见代码注释。

    时间O(n^2)

    空间O(1)

    Java实现

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     int val;
     5  *     ListNode next;
     6  *     ListNode(int x) { val = x; }
     7  * }
     8  */
     9 class Solution {
    10     public ListNode insertionSortList(ListNode head) {
    11         // corner case
    12         if (head == null || head.next == null) {
    13             return head;
    14         }
    15         // normal case
    16         ListNode dummy = new ListNode(0);
    17         dummy.next = head;
    18         // cur节点用来遍历整个list
    19         ListNode cur = head;
    20         ListNode temp = null;
    21         ListNode prev = null;
    22         // 4->2->1->3
    23         while (cur != null && cur.next != null) {
    24             // 如果节点顺序对,就接着往后走
    25             if (cur.val <= cur.next.val) {
    26                 cur = cur.next;
    27             } else {
    28                 // temp保存那个较小的节点值
    29                 // 比如例子中一开始的2
    30                 temp = cur.next;
    31                 // 4 -> 1
    32                 cur.next = temp.next;
    33                 // prev又从头开始遍历链表
    34                 prev = dummy;
    35                 while (prev.next.val <= temp.val) {
    36                     prev = prev.next;
    37                 }
    38                 // 2 -> 4
    39                 temp.next = prev.next;
    40                 // dummy -> 2
    41                 prev.next = temp;
    42             }
    43         }
    44         return dummy.next;
    45     }
    46 }

    LeetCode 题目总结

  • 相关阅读:
    用bat更改hosts文件批处理
    docker 清理容器的一些命令,彻底或选择清理
    Hbase+Phoenix环境部署和使用
    使用内置tomcat的pom配置
    git修改已提交记录的用户信息
    Linux清空正在运行的log日志文件内容
    Maven打包: 包含依赖jar和指定Main class
    docker-compose 搭建 kafka
    Java URLEncoder 兼容 js encodeURIComponent
    linux查找删除大文件
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13737509.html
Copyright © 2011-2022 走看看