【Java】【LeetCode】147. Insertion Sort List

题目:

Sort a linked list using insertion sort.


A graphical example of insertion sort. The partial sorted list (black) initially contains only the first element in the list.
With each iteration one element (red) is removed from the input data and inserted in-place into the sorted list
 

Algorithm of Insertion Sort:

  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.


Example 1:

Input: 4->2->1->3
Output: 1->2->3->4

Example 2:

Input: -1->5->3->4->0
Output: -1->0->3->4->5

题解:

 Insertion Sort就是把一个一个元素往已排好序的list中插入的过程。

 初始时,sorted list是空,把一个元素插入sorted list中。然后,在每一次插入过程中,都是找到最合适位置进行插入。

 因为是链表的插入操作,需要维护pre,cur和next3个指针。

 pre始终指向sorted list的fakehead,cur指向当前需要被插入的元素,next指向下一个需要被插入的元素。

 

 当pre.next不为空以及pre.next所指向的元素比cur指向的元素值要大时,需要把cur元素插入到pre.next所指向元素之前。否则,pre指针后移。最后返回fakehead的next即可。

 

代码如下:

public class InsertionSortList
{

  public static void main(String[] args)
  {
    /**
     * Sort a linked list using insertion sort.
     * 
     * 
     * A graphical example of insertion sort. The partial sorted list (black)
     * initially contains only the first element in the list. With each iteration
     * one element (red) is removed from the input data and inserted in-place into
     * the sorted list
     * 
     * 
     * Algorithm of Insertion Sort:
     * 
     * 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.
     * 
     * Example 1:
     * 
     * Input: 4->2->1->3 Output: 1->2->3->4 Example 2:
     * 
     * Input: -1->5->3->4->0 Output: -1->0->3->4->5
     */
    ListNode ln11 = new ListNode(4);
    ListNode ln12 = new ListNode(2);
    ListNode ln13 = new ListNode(1);
    ListNode ln14 = new ListNode(3);
    ln11.next = ln12;
    ln12.next = ln13;
    ln13.next = ln14;
    LeetCodeUtil.printNodeList(insertionSortList(ln11));
    ListNode ln21 = new ListNode(-1);
    ListNode ln22 = new ListNode(5);
    ListNode ln23 = new ListNode(3);
    ListNode ln24 = new ListNode(4);
    ListNode ln25 = new ListNode(0);
    ln21.next = ln22;
    ln22.next = ln23;
    ln23.next = ln24;
    ln24.next = ln25;
    LeetCodeUtil.printNodeList(insertionSortList(ln21));
  }

  public static ListNode insertionSortList(ListNode head)
  {
    if (head == null || head.next == null)
    {
      return head;
    }
    ListNode sortHead = new ListNode(0);
    while (head != null)
    {
      ListNode prev = sortHead;
      ListNode next = head.next;
      while (prev.next != null && head.val > prev.next.val)
      {
        prev = prev.next;
      }
      head.next = prev.next;
      prev.next = head;
      head = next;
    }
    return sortHead.next;
  }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值