排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

选择插入排序算法:

插入排序算法的原理是让锚点前面的数值都有序,每次都从锚点之后找到一个值往前插入。

分为两步:

  • 1 遍历链表
  • 2 从链表中找到合适的插入位置

一些小细节,先去原始链表中找到一个节点,然后从dummy节点开始找到适合插入的位置原始链表少一个几点,dummy链表多一个节点):

  • 1 遍历链表是从head开始
  • 2 在从链表中找到合适的插入位置之前需要保存好cur的下一个位置,用于更新遍历链表
  • 3 从链表中找到合适的插入位置是从dummy节点开始。
  • 4 链表的插入需要先顾尾后顾头
  • 5 链表的循环从head开始,到最后一个节点结束.
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* sortList(ListNode* head) {
        ListNode* dummy = new ListNode(0);
        ListNode* cur = head;
        while(cur){
            ListNode* in_cur = dummy;
            ListNode* next_node = cur->next;
            while(in_cur->next && in_cur->next->val <= cur->val){
                in_cur = in_cur->next;
            }
            cur->next = in_cur->next;
            in_cur->next = cur;
            cur = next_node;
        }
        return dummy->next;
    }
};