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;
    }
};
posted @ 2020-11-20 20:42  行者橙子  阅读(126)  评论(0编辑  收藏  举报