LeetCode | Insertion Sort List
题目:Sort a linked list using insertion sort.
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */
//插入排序,每次把A[p]插入到正确的位置 public class Solution { public ListNode insertionSortList(ListNode head) { if ( head==null || head.next==null ) return head; ListNode newHead = new ListNode(0); newHead.next = head; ListNode pre = head; //取例: 4 8 3 1 5 ListNode post = head.next; //pre和post用来向后遍历list,查找是否有逆序的存在 while( post != null){ if( post.val >= pre.val ) //正常情况(4<8),继续向后前进查找逆序 { pre = pre.next; post = post.next; } else{ //说明查找到了逆序的存在(8>3),要利用插入排序,把post<插入>到正确的位置 ListNode insertPre = newHead; ListNode insertPost = newHead.next; //这两个变量用来查找插入的位置,插入到insertPre与insertPost之间 while( insertPost.val < post.val ){ //查找插入位置,插入位置应该在List中第一个大于A[p]之前,例如3要插入到4之前 //第一个大于A[p]的位置即insertPost //注:插入A[p]时,其左边已处于排序好的状态 insertPre = insertPost; insertPost = insertPost.next; } pre.next = post.next; //在把post插入到正确位置之前,要记得把pre和后边的list接上,把8和1连上 insertPre.next = post; post.next = insertPost; //此两行即把post插入到正确的位置 post = pre.next; //在进行下一次循环前,重新把post置为pre的下一个 } } return newHead.next; } }