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 *insertNode(ListNode *head,ListNode *p){
ListNode *cur = head;
if (head->val > p->val) {
p->next = head;
return p;
}
while (cur->next && cur->next->val <=p->val) {
cur = cur->next;
}
if (cur->next && cur->next->val > p->val) {
p->next = cur->next;
cur->next = p;
} else {
cur->next = p;
p->next = NULL;
}
return head;
}
ListNode *insertionSortList(ListNode *head) {
if (!head) return NULL;
ListNode *p = head->next;
head->next =NULL;
while (p ){
ListNode *temp = p;
p = p->next;
head = insertNode(head,temp);
}
return head;
}
};