147. Insertion Sort List

来源:互联网 发布:水晶排课软件 编辑:程序博客网 时间:2024/05/16 23:59

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


0 0
原创粉丝点击