1. 题目来源
2. 题目说明
3. 题目解析
模拟插入排序,运用虚拟头结点来处理头结点一直改变的这种边界情况。
思路:
- 顺序遍历链表每个节点。 O ( n ) O(n) O(n)
- 以虚拟头结点作为新排序链表连接起来
- 按照插入排序的方式,虚拟头结点这条链表一直处于有序状态
- 每次需要顺序查找当前节点应该插入的位置。 O ( n ) O(n) O(n)
- 故, O ( n 2 ) O(n^2) O(n2)
挺精妙的写法,一开始处理尾结点为 NULL
这个情况一直报错… 结果发现不用特意处理…代码自身就能保证~
代码:
/**
* 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) {
auto dummy = new ListNode(-1);
for (auto p = head; p; ) {
auto cur = dummy, next = p->next;
while (cur->next && cur->next->val <= p->val) cur = cur->next;
p->next = cur->next;
cur->next = p;
p = next;
}
return dummy->next;
}
};