思路:类似链表翻转
首先,对链表扫描知道不符合从小到大顺序的结点,记录排好序链表的头结点
然后,从头扫描排好序的结点,找到第一个大于插入节点的结点,并记录该节点之前的结点,将其插入
代码:(自己写的)
ListNode *insertionSortList(ListNode *head) {
if (head == nullptr || head->next == nullptr)
return head;
ListNode * node = head;//找到第一个不按顺序排列的数 pNext记录node后面那个节点
ListNode * pNext = node->next;
while (pNext != nullptr &&pNext->val > node->val){
node = pNext;
pNext = pNext->next;
}
node->next = nullptr;
ListNode * pPrev = head;//翻转链表的头结点
node = pNext;
ListNode* pahead = nullptr;
while (node != nullptr){
pNext = node->next;
ListNode * temp_head = pPrev;
while (pPrev != nullptr && pPrev->val < node->val){//扫描前面排好的列表pahead记录大于插入节点之前的结点
pahead = pPrev;
pPrev = pPrev->next;
}
if (temp_head != pPrev){//插在中间或者最后
pahead->next = node;
node->next = pPrev;
pPrev = temp_head;//排好序头结点
}
else{//插在最开始的地方(插入的值是最小的)
node->next = pPrev;
pPrev = node;
}
node = pNext;
}
return pPrev;
}
牛客上的
链接:https://www.nowcoder.com/questionTerminal/152bc6c5b14149e49bf5d8c46f53152b
来源:牛客网
ListNode *insertionSortList(ListNode *head) {
if (!head)
return head;
ListNode tmp(0);
ListNode* p, *q, *t;
while (head) {
p = &tmp;
q = p->next;
t = head;
head = head->next;
while (q && q->val < t->val) {
p = p->next;
q = q->next;
}
t->next = q;
p->next = t;
}
return tmp.next;
}