《中英双解》leetCode 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:

Insertion sort iterates, consuming one input element each repetition and growing a sorted output list.
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.
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.

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

插入排序算法:

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

Example 1:


Input: head = [4,2,1,3]
Output: [1,2,3,4]
Example 2:


Input: head = [-1,5,3,4,0]
Output: [-1,0,3,4,5]

Constraints:

The number of nodes in the list is in the range [1, 5000].
-5000 <= Node.val <= 5000

这题主要考察的是运用链表来实现插入排序,比起使用数组也是稍微有一些不同,数组的插入排序也用到了后移元素和元素的替换,详细可以看我这篇博客

排序

下面我们看看如何用链表进行实现

class Solution {
    public ListNode insertionSortList(ListNode head) {
      //首先判断头结点是否为空
      if(head == null){
         return head;
      }
      //创建新节点,并指向头结点
      ListNode newNode = new ListNode(-1);
      newNode.next = head;
      
      ListNode slow = head;
      ListNode fast = head.next;
      //循环进行遍历
      while(fast != null){
         //判断slow是否大于fast
         if(slow.val <= fast.val){
           slow = slow.next;
         } else {
           ListNode pre = newNode;
           //遍历pre
           while(pre.next.val <= fast.val){
              pre = pre.next;
           }
           slow.next = fast.next;
           fast.next = pre.next;
           pre.next = fast;
         }
         //更新fast
         fast = slow.next;
      }
      return newNode.next;
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值