1. 程式人生 > 其它 >牛客經典筆刷演算法題-LC5-連結串列的插入排序

牛客經典筆刷演算法題-LC5-連結串列的插入排序

技術標籤:演算法排序演算法連結串列

牛客經典筆刷演算法題-LC5-連結串列的插入排序

本題連結

題目描述

使用插入排序對連結串列進行排序。

示例

輸入
{30,20,40}
 
返回值
{20,30,40}

思路

通過虛擬頭節點處理連結串列排序

插入排序演算法描述:

  • 步驟一:從第一個元素開始,該元素可以認為已經被排序;
  • 步驟二:取出下一個元素,在已經排序的元素序列中從後向前掃描;
  • 步驟三:如果該元素(已排序)大於新元素,將該元素移到下一位置;
  • 步驟四:重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;
  • 步驟五:將新元素插入到該位置後;
  • 步驟六:重複步驟二~五

解答

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode類 
     * @return ListNode類
     */
    public ListNode insertionSortList (ListNode head) {
        if(head == null || head.next == null) return head;
        // 虛節點
        ListNode dummy = new ListNode(-1), pre;
        dummy.next = head;
        
        while(head != null && head.next != null){
            // 如果小於下一節點,直接跳過,加速排序
            if(head.val <= head.next.val){
                head = head.next;
                continue;
            }
            
            // 尋找當前節點正確位置
            pre = dummy;
            while(pre.next.val < head.next.val) pre = pre.next;
            // 取出當前節點curr
            ListNode curr = head.next;
            //儲存下一節點
            head.next = curr.next;
            // 插入操作
            curr.next = pre.next;
            pre.next = curr;
        }
        return dummy.next;
    }
}