您的位置:首页 > 其它

LeetCode | Insertion Sort List

2014-10-26 09:50 363 查看
题目: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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 插入排序