对链表进行插入排序

≡放荡痞女 提交于 2020-01-04 12:36:36

对链表进行插入排序。

插入排序算法:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
 

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

思路:

1.将链表分成已排序的链表和未排序的链表两部分,切记要把两部分切断。

2. 每次将未排序链表的第一个节点拎出来,插入已排序链表的合适位置。

/**
 * 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) {
        if(head==NULL||head->next==NULL) return head;
        ListNode* dummy = new ListNode(0);
        dummy->next     = head;
        ListNode* head2= head->next;
        head->next=NULL;
        while(head2)
        {
            ListNode* cur=head2;
            head2 = head2->next;
            ListNode* pre=dummy;
            ListNode* travel=pre->next;
            for (; travel&&travel->val<=cur->val; pre=travel, travel=travel->next);            
            pre->next=cur;
            cur->next=travel;
            
        } 
        head= dummy->next;
        delete dummy;
        dummy=NULL;
        return head;
    }
};

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!