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
思路解析
- 新建一个节点
dhead
,令dhead->next = head
,方便后续插入; - 记录节点
lastSorted
,指向已经排序好的最后一个节点,初始化时lastSorted = head
; - 开始遍历链表,记录当前节点为
p
; - 比较
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;
}
};
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 如何打造一个高并发系统?
· 【译】我们最喜欢的2024年的 Visual Studio 新功能