1. 程式人生 > >LeetCode 147.對連結串列進行插入排序

LeetCode 147.對連結串列進行插入排序

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


插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。

 

插入排序演算法:

  1. 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
  2. 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
  3. 重複直到所有輸入資料插入完為止。

 

示例 1:

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

示例 2:

輸入: -1->5->3->4->0
輸出: -1->0->3->4->5

思路:在兩個連結串列上進行操作。一個是原本的連結串列,再新定義一個連結串列。對就連結串列逐個遍歷,按照插入排序的方式插入新的連結串列中。

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
7 * } 8 */ 9 class Solution { 10 public ListNode insertionSortList(ListNode head) { 11 //基本思想:遍歷舊連結串列,插入新連結串列 12 //建立新的連結串列:只要有個頭就可以了 13 ListNode newHead = null; 14 //在遍歷新的連結串列中沒移動一次需要記住前驅 15 ListNode pre = null; 16 //舊連結串列中取出來的待排序的結點 17 ListNode wait = null
; 18 //新連結串列中和待排序結點比較的當前結點 19 ListNode cur = null; 20 //考慮輸入的連結串列為空的情況 21 if(head == null) 22 return null; 23 //輸入的連結串列不是空的,就開始遍歷並插入新的連結串列,用while迴圈比較好,遍歷只能從前往後 24 while(head!=null){ 25 wait = head; 26 head = head.next; 27 wait.next = null; 28 if(newHead == null){ 29 newHead = wait; 30 } 31 else{ 32 cur = newHead; 33 while(wait.val >= cur.val&&cur.next!=null){ 34 pre = cur; 35 cur = cur.next; 36 } 37 //插在連結串列的頭部 38 if(cur==newHead){ 39 if(wait.val<cur.val){ 40 wait.next = cur; 41 newHead = wait; 42 } 43 else{ 44 cur.next = wait; 45 } 46 } 47 else{ 48 //插在連結串列的尾部 49 if(cur.next==null&&wait.val>=cur.val){ 50 cur.next = wait; 51 } 52 else{ 53 pre.next = wait; 54 wait.next = cur; 55 } 56 } 57 } 58 } 59 return newHead; 60 } 61 }

總結:這是最笨的一種方法。暴露的問題是你對連結串列的及其不瞭解和不熟悉。裡面有很多預設的東西以及很多對於完成題目來說的基礎的概念和認識需要加強。