zoukankan      html  css  js  c++  java
  • LeetCode 147. 对链表进行插入排序

    题目描述

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

    示例1:

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

    示例2:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/insertion-sort-list

    思路解析

    1. 新建一个节点 dhead,令dhead->next = head,方便后续插入;
    2. 记录节点 lastSorted,指向已经排序好的最后一个节点,初始化时 lastSorted = head
    3. 开始遍历链表,记录当前节点为 p
    4. 比较 lastSorted 与当前节点 p 的值,若 lastSorted->val < p->val,则p在当前位置直接就是有序的,lastSorted 后移一位,否则将p插入到前面,并更新lastSorted->next = p->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) {
            if(!head) return head;
            ListNode* dhead = new ListNode(0);
            dhead->next = head;
            ListNode* lastSorted = head;
            ListNode* p = head->next;
            while(p != NULL) {
                if(lastSorted->val < p->val) {
                    lastSorted = p;
                    p = p->next;
                }
                else {
                    ListNode* insp = dhead;
                    ListNode* ins = dhead->next;
                    while(ins->val < p->val) {
                        ins = ins->next;
                        insp = insp->next;
                    }
                    ListNode* nxt = p->next;
                    lastSorted->next = nxt;
                    insp->next = p;
                    p->next = ins;
                    p = nxt;
                }
            }
            return dhead->next;
        }
    };
    
  • 相关阅读:
    C语言实现快排
    C语言实现双向循环链表
    mysql插入数据后返回自增ID的方法
    golang flag包简单例子
    练习题 (六)
    练习题 (五)
    练习题 (四)
    练习题 (三)
    练习题 (二)
    练习题 (一)
  • 原文地址:https://www.cnblogs.com/xqmeng/p/14012933.html
Copyright © 2011-2022 走看看