Sort a linked list using insertion sort.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode insertionSortList(ListNode head) {
}
}
大神们的解决思路如下:
建立一个node:helper作为已排序链表的头,建立三个辅助指针pre,cur,next。pre用于指定已排序链表的前一帧,cur和next用于原始链表的当前帧和下一帧。即:
helper(pre)->null
head(cur)->first(next)->…->null
利用代码段
cur.next = pre.next;
pre.next = cur;
pre = helper;
cur = next;
来使得cur指的帧插入pre和pre.next之中。得到:
helper(pre)->head->null
head->first(cur)->second(next)->…->null
再通过代码段
while( pre.next != null && pre.next.val < cur.val ){
pre = pre.next;
}
来是的pre.next和cur进行毕竟,对如下情况:
helper(pre)->head->first->null
head->first->second(cur)->third(next)…->null
若pre.next(head)
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 list
while( cur != null ){
next = cur.next;
//find the right place to insert
while( 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;
}