天天看點

147. 對連結清單進行插入排序

對連結清單進行插入排序。

147. 對連結清單進行插入排序

插入排序的動畫示範如上。從第一個元素開始,該連結清單可以被認為已經部分排序(用黑色表示)。

每次疊代時,從輸入資料中移除一個元素(用紅色表示),并原地将其插入到已排好序的連結清單中。

插入排序算法:

  1. 插入排序是疊代的,每次隻移動一個元素,直到所有元素可以形成一個有序的輸出清單。
  2. 每次疊代中,插入排序隻從輸入資料中移除一個待排序的元素,找到它在序列中适當的位置,并将其插入。
  3. 重複直到所有輸入資料插入完為止。

示例 1:

輸入: 4->2->1->3
輸出: 1->2->3->4
           

思路:

             先将連結清單第一個元素斷開聯系,預設一個元素是已經排好序的,在将剩餘元素标記為未排序的連結清單,之後每次循環未排序連結清單中每一個元素, 先和排序連結清單的頭比較,如果比頭下則直接插入到頭前面,如果比頭大則依次周遊排序數組中每一個元素,知道找到比目前元素大的元素,然後将其插入到這個元素前面,如果一直周遊到最後都沒有比他大的則直接插入到最後。代碼如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode InsertionSortList(ListNode head) {
        if(head == null || head.next == null) return head;
        //未排序的連結清單,預設第一個元素是排好序的
        ListNode noFinish = head.next;
        head.next = null;   //排好序的連結清單
        ListNode current,finish;    //current是未排序連結清單每一個值  finish是排好序的連結清單
        while(noFinish != null){
            current = noFinish;     
            noFinish = noFinish.next;
            current.next = null;    //斷開聯系,取出目前未排序的節點
            if(head.val > current.val){     //和排序連結清單中第一個元素比較
                current.next = head;
                head = current;
                continue;
            }
            finish = head;
            while(finish.next != null){     //和排序連結清單後面每一個元素比較
                if(finish.next.val > current.val){
                    current.next = finish.next;
                    finish.next = current;
                    break;
                }
                finish = finish.next;
            }
            if(finish.next == null){        //直接加入到最後一個元素
                finish.next = current;
            }
        }
        return head;
    } 
}
           

繼續閱讀