Sort a linked list using insertion sort.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
if(NULL == head || NULL == head->next){return head;}
ListNode *runner = head;
ListNode *prerunner = head;
ListNode *handle = head->next;
ListNode *prehandle = head;
while(handle)
{
runner = head;
prerunner = head;
while(runner!= handle && handle->val>=runner->val)
{
prerunner = runner;
runner = runner->next;
}
if(runner == handle)
{
prehandle = handle;handle = handle->next;
}
else
{
prehandle->next = handle->next;
if(runner == head)
{
head = handle;
handle->next = runner;
}
else
{
handle->next = runner;
prerunner->next = handle;
}
handle = prehandle->next;
}
}
return head;
}
};
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
if(NULL == head || NULL == head->next){return head;}
ListNode firstnode(0);
firstnode.next = head;
ListNode *handle = head->next;
ListNode *prehandle = head;
while(handle)
{
ListNode *prerunner = &firstnode;
ListNode *runner = firstnode.next; //head may change
while(runner!= handle && handle->val>=runner->val)
{
prerunner = runner;
runner = runner->next;
}
if(runner == handle)
{
prehandle = handle;handle = handle->next;
}
else
{
prehandle->next = handle->next;
handle->next = runner;
prerunner->next = handle;
handle = prehandle->next;
}
}
return firstnode.next;
}
};