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;
}
};