insertion-sort-list
链表插入排序(由小到大)。
输入:链表的头指针,
输出:排序后链表的头指针。
实现方法:将原链表拆成两部分:链表1仍以head为头指针,链表结点有序。链表2以head2为头指针,链表结点无序。
将链表2中的结点依次插入到链表1中,并保持链表1有序。
最后链表1中包含所有结点,且有序。
带头结点
ListNode* insertionSortList(ListNode* head) {
if(head == NULL||head->next == NULL) return head;
ListNode* newhead = new ListNode(0); //新建辅助头结点;
ListNode* p,*q,*pre;
p=head;
while(p!=NULL)
{
q = p->next; //记录下一个结点;
pre = newhead; //每次都遍历一次新链表;
while(pre->next != NULL && pre->next->val < p->val)
{
pre=pre->next;
}
p->next=pre->next;
pre->next=p;
p=q;
}
return newhead->next;
}
不带头结点
ListNode *insertionSortList(ListNode* head) {
if(head == NULL || head->next == NULL) return head;
ListNode* p ,*q, *pre, *post;
p = head->next;
head->next = NULL;
while(p != NULL)
{
q = p;
post = head;
while(post != NULL && post->val <= q->val)
{
pre = post;
post = post->next;
}
p = p->next;
if(post == head)
{
head = q;
}
else
{
pre->next = q;
}
q->next = post;
}
return head;
}