147. Insertion Sort List

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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值