/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/publicclassSolution {public ListNode insertionSortList(ListNode head) {
if(head == null || head.next == null){
return head;
}
int len = 0;
ListNode node = head;
while(node != null){
len++;
node = node.next;
}
ListNode newHead = new ListNode(0);
newHead.next = head;
for(int i=1; i < len; i++){
int step = i;
ListNode compareNode = newHead;//第i趟插入,第i+1个元素找到自己的位置
ListNode beforeCompare = compareNode;
while(step >= 0){
beforeCompare = compareNode;
compareNode = compareNode.next;
step--;
}
ListNode pre = newHead;
ListNode next = pre.next;
int j = 1;
while(j <= i && next.val <= compareNode.val){
pre = next;
next = next.next;
j++;
}
//如果前面没有元素比compareNode的值大,就不需要修改指针if(pre != beforeCompare){
pre.next = compareNode;
beforeCompare.next = compareNode.next;
compareNode.next = next;
}
}
return newHead.next;
}
}
Discuss里简洁的算法(只用了3个临时指针)
publicclass Solution {
public ListNode insertionSortList(ListNode head) {
if( head == null ){
return head;
}
ListNode helper = new ListNode(0); //new starter of the sorted list
ListNode cur = head; //the node will be inserted
ListNode pre = helper; //insert node between pre and pre.next
ListNode next = null; //the next node will be inserted//not the end of input listwhile( cur != null ){
next = cur.next;
//find the right place to insertwhile( pre.next != null && pre.next.val < cur.val ){
pre = pre.next;
}
//insert between pre and pre.next
cur.next = pre.next;
pre.next = cur;
pre = helper;
cur = next;
}
return helper.next;
}
}