Files
leetcode-master/problems/0147.对链表进行插入排序.md
youngyangyang04 04145a2e6c Update
2020-11-21 13:35:12 +08:00

2.4 KiB
Raw Blame History

思路

这道题目还是很考察链表操作的。

如果不用虚拟头结点的话,这道题会很麻烦,对虚拟头结点不熟悉的同学,可以看这篇:链表:听说用虚拟头节点会方便很多?

如果想整体掌握链表操作的话,看一下这篇链表大总结

本题在模拟插入排序的过程中,一共要有三次改变节点指针的操作,如果不画一个图,很容易搞蒙了。

我举一个排序插入节点2的例子并详细标注了每一个步骤晚上一个插入操作有五步如下

代码中注释的步骤和图中都是一一对应的对着图看代码就比较清晰了C++代码如下:

class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        if (head == nullptr) return head;

        ListNode* dummyHead = new ListNode(0); // 定一个虚拟头结点
        ListNode* cur = head;
        ListNode* pre = dummyHead;

        while (cur != nullptr) {
            while (pre->next != nullptr && pre->next->val < cur->val) {
                pre = pre->next;
            }
            // 在pre和prenext之间插入数据
            ListNode* next = cur->next; // 步骤一保存curnext
            cur->next = pre->next;      // 步骤二
            pre->next = cur;            // 步骤三
            pre = dummyHead;            // 步骤四pre重新指向虚拟头结点来找下一个插入位置
            cur = next;                 // 步骤五cur的前一个节点的下一个节点指向保存的next
        }
        return dummyHead->next;
    }
};

我是程序员Carl组队刷题可以找我,本文leetcode刷题攻略已收录,更多精彩算法文章尽在:代码随想录,关注后就会发现和「代码随想录」相见恨晚!

如果感觉题解对你有帮助,不要吝啬给一个👍吧!