Sort a linked list using insertion sort.
Analysis
The general idea is insert the current element A[i] into the proper position from A[0]...A[i-1], and A[0]...A[i-1] is already sorted.
In this problem, we can use the same idea and linked list provides a more efficient way for insertion. Details can be found in the code below. Note that after the insertion, the position of P is unchanged but should not provide another p=p->next operation.
Complexity is O(n^2)
java
public ListNode insertionSortList(ListNode head) {
if(head == null || head.next == null) return head;
ListNode newHead = new ListNode(-1);
newHead.next = head;
ListNode cur = head;
ListNode post = head.next;
while(post!=null){
if(post.val>=cur.val){
cur = cur.next;
post = post.next;
}else {
ListNode insertCur = newHead;
ListNode insertPost = newHead.next;
while(insertPost.val<post.val){
insertCur = insertPost;
insertPost = insertPost.next;
}
cur.next = post.next;
post.next = insertPost;
insertCur.next = post;
post = cur.next;
}
}
return newHead.next;
}
c++
ListNode *insertionSortList(ListNode *head) {
if(head == NULL) return head;
ListNode *p = new ListNode(-1);
p->next = head;
ListNode *pre = head;
ListNode *cur = pre->next;
while(cur){
if(cur->val >= pre->val){
pre = cur;
cur = cur->next;
}else{
ListNode *insertPre = p;
ListNode *insertCur = p->next;
while(insertCur->val < cur->val){
insertPre = insertCur;
insertCur = insertCur->next;
}
pre->next = cur->next;
cur->next = insertCur;
insertPre->next = cur;
cur = pre->next;
}
}
head = p->next;
return head;
}