147. Insertion Sort List
Sort a linked list using insertion sort.
题意:插入排序的链表实现。
思路:定义两个链表指针start和end,start指向已经排好序的链表的指针头,end指向已经排好序的指针的结尾。例如对于:
eg: 1->2->4->5以排好序)->3->......;这里start指向1,end指向5。然后定义一个指针cur,指向将要遍历的节点。
对于插入排序分3中情况,
1. 如果cur->val在start与end之间,则从开头遍历,直至找到p->val>cur->val,将其插入p的前面。
2. 如果cur->val比start都要小,则要将其作为新的开头节点。
3. 如果cur->val大于end,则直接end=end->next,即可。
/**
* 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) {
ListNode* start=new ListNode(0),*end,*cur;
start->next=end=head;
if(!head||!head->next) return head;
cur=head->next;
while(cur)
{
ListNode* nxt=cur->next;//cur接下来会变位置,要事先记着next
ListNode* p=start->next;
ListNode* tmp=NULL;
while(p!=cur&&p->val<cur->val)//找到要插入的位置
{tmp=p;p=p->next;}
if(tmp==NULL)//要插到开头
{
start->next=cur;
end->next=cur->next;
cur->next=p;
}else if(p==cur)//插到结尾
end=end->next;
else//查到中间tmp与p之间
{
end->next=cur->next;
tmp->next=cur;
cur->next=p;
}
cur=nxt;
}
return start->next;
}
};