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;
}
// write code here
ListNode list = head;//排好序的链表初始状态,只包含第一个节点
ListNode p = list.next; //p从第二个结点开始对链表进行遍历
list.next=null;
ListNode q = new ListNode(0);
ListNode pre = new ListNode(0);
while(p!=null){
//1.确定当前结点p插入的位置(插入第一个位置)
if(p.val<list.val){//p结点的值最小,插入到第一个位置
q = p.next;
p.next = list; //将p结点插入到第一个位置
list = p;
p=q;
}else{
//2.插入到其他位置
pre = list;
//寻找第一个大于等于p的结点 的前驱节点
while(pre.next!=null && pre.next.val<p.val){
pre = pre.next;
}
//将p插入到pre节点的后面
q = p.next;
p.next = pre.next;
pre.next = p;
p=q;
}//else
}//while
return list;
}
}