第一步:取出一个链表中的一个节点,作为新链表的头节点
第二步:再次从链表中取出一个节点,在新链表中查找节点的插入位置进行插入,有以下三种情况
(1)节点插入的位置在新链表的头节点之前
(2)节点的插入位置在新链表的尾节点之后
(3)节点的插入位置在新链表的中间
依次对这三种情况实行插入操作即可
/**
* 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) {
// 取第一个节点作为头节点,然后节点依次拆下进行比较,并插入
// 取下第一个节点
if(head == nullptr){
return head;
}
ListNode* head_new = head;
head = head ->next;
head_new->next = nullptr;
// 循环遍历节点
while(head){
// 拆下一个节点
ListNode *t = head;
head = head->next;
t->next = nullptr;
// 将节点插入到新链表中
if(t->val<head_new->val){
// 如果取下的节点比头节点小,那么插入头节点之前
t->next = head_new;
head_new = t;
}else{
// 如果取下的节点比头节点大,看节点是否比最后一个大
ListNode* p = head_new;
ListNode* q = p->next;
if(p->next == nullptr){
p->next = t;
continue;
}
// 由于这个地方每次都需要遍历新表,所以时间复杂度为 o(n2)
while(q!=nullptr){
if(t->val>q->val){
p = q;
q = p->next;
}else{
break;
}
}
if(q == nullptr){
// 说明插入的节点在末尾,那么直接插入末尾
p->next = t;
}else{
// 说明插入的 节点在中间,在q节点之前和p节点之后插入
t->next = q;
p->next = t;
}
}
}
head = head_new;
return head;
}
};