• Leetcode: Insertion Sort List


    Sort a linked list using insertion sort.

     我原本的想法是用额外的空间拷贝每一个节点,建立了一个新的sorted的LinkedList, 后来看到别人的做法不用建立新的LinkedList,  直接以原有List上的节点组成新的sorted的LinkedList。我之前想这样做会扰乱遍历的顺序,但是其实sorted的list和unsorted list是完全分开互不影响的。先还是给sorted list建立一个dummy node做前置节点, 每次取unsorted list里面的一个节点,记录下下一跳位置,然后把这个点插入到sorted list对应位置上(pre.next指到null或者pre.next。val更大)。

    Insert Sort的做法相当于是每次从原来的List里面删除头节点,再把这个头节点插入到新的List里相应的位置。这个新List全由原来的节点组成,只是变换了顺序。

    时间复杂度是插入排序算法的O(n^2),空间复杂度是O(1)。

    第二遍做法:

     1 public class Solution {
     2     public ListNode insertionSortList(ListNode head) {
     3         ListNode dummy = new ListNode(-1);
     4         ListNode cursor = dummy;
     5         while (head != null) {
     6             ListNode next = head.next;
     7             while (cursor.next!=null && cursor.next.val<=head.val) {
     8                 cursor = cursor.next;
     9             }
    10             head.next = cursor.next;
    11             cursor.next = head;
    12             head = next;
    13             cursor = dummy;
    14         }
    15         return dummy.next;
    16     }
    17 }

    第一遍做法:

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     int val;
     5  *     ListNode next;
     6  *     ListNode(int x) {
     7  *         val = x;
     8  *         next = null;
     9  *     }
    10  * }
    11  */
    12 public class Solution {
    13         public ListNode insertionSortList(ListNode head) {
    14         if(head == null)
    15             return null;
    16         ListNode helper = new ListNode(0);
    17         ListNode pre = helper;
    18         ListNode cur = head;
    19         while(cur!=null)
    20         {
    21             ListNode next = cur.next;
    22             pre = helper;
    23             while(pre.next!=null && pre.next.val<=cur.val)
    24             {
    25                 pre = pre.next;
    26             }
    27             cur.next = pre.next;
    28             pre.next = cur;
    29             cur = next;
    30         }
    31         return helper.next;
    32       }
    33 }

    上面程序注释如下:

     1 public ListNode insertionSortList(ListNode head) {
     2     if(head == null)
     3         return null;
     4     ListNode helper = new ListNode(0);//helper is the dummy head for the result sorted LinkedList
     5     ListNode pre = helper; //pre is the pointer to find the suitable place to plug in the current node
     6     ListNode cur = head; //cur is current node, the node to be plugged in the sorted list
     7     while(cur!=null)
     8     {
     9         ListNode next = cur.next; //keep a record of the current node's next
    10         pre = helper;  //after one search, put pre back to its original place
    11         while(pre.next!=null && pre.next.val<=cur.val) //use pre to traverse the sorted list to find the suitable place to plug in
    12         {
    13             pre = pre.next;
    14         }
    15         cur.next = pre.next;// plug in current node to the right place
    16         pre.next = cur;
    17         cur = next; //go on to deal with the next node in the unsorted list
    18     }
    19     return helper.next;
    20 }
  • 相关阅读:
    JS Map的使用
    C# 创建Windows服务
    Oracle 表空间不足解决办法
    C# 企业微信API开发(获取Token,给用户发送消息)
    企业微信API开发笔记
    css实现div不定宽高垂直水平居中解决方案
    前端面试题目大全(附答案)
    移动Web开发
    jquery 给iframe里的元素添加事件
    Jquery实现可拖动进度条demo
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/3976821.html
Copyright © 2020-2023  润新知