Sort a linked list using insertion sort.
提供两种思路,递归和非递归。
递归思路:
递归的对链表进行插入排序,递归直到链表末尾结束,然后进行插入排序。
举个例子:4->6->5->7->2->3->null
对其递归进行插入排序,那么会得到3->null。然后是2->3->null。然后当将7插入末尾链表的时候,对2->3->null进行遍历并比较其链表结点的值与待插入的链表结点值7。然后插入合适的地方,最后得到2->3->7>null。依次递归下去。
代码如下
ListNode *insertionSortList(ListNode *head) {
if(!head || !head->next) return head;
ListNode dummyHead(0), *p;
dummyHead.next = insertionSortList(head->next);
p = &dummyHead;
while(p && p->next && head->val > p->next->val){
p = p->next;
}
head->next = p->next;
p->next = head;
return dummyHead.next;
}
非递归思路:
新建一个空链表,将原链表逐个遍历插入新链表中,注意,需要遍历新链表用以比较原链表的结点的值以插入到新链表合适的地方。
代码如下:
ListNode *insertionSortList(ListNode *head) {
if(!head || !(head->next))
return head;
ListNode new_ptr(0);
ListNode *N_Head = &new_ptr;
while(head)
{
ListNode *p = head;
head = head->next;
ListNode *q = N_Head;
while(q->next && q->next->val < p->val)
{
q = q->next;
}
p->next = q->next;
q->next = p;
}
return N_Head->next;
}