题目
我又被几个结点给绕晕了= =,记住一般这种排序、插入类型的题,都需要dummy + 三个结点才行
直插这个方法我最开始是写148题的,但那个题复杂度居然超了!必须要O(n2),放到147题居然就行,好吧,看来148题是147的升级版。看来还是对排序算法不够熟悉,下去再把那3个O(logn)的排序再写一遍,148题估计就能过了。
代码(自解+看部分答案)
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
if(!head)
return nullptr;
auto dummy = new ListNode(0, head); // 虚拟头结点
auto p = dummy->next;
ListNode* pre = nullptr;
auto r = p->next; // 三个指针,保证不断链
p->next = nullptr;
p = r;
while(p) {
r = p->next;
pre = dummy; // 从头开始
while(pre->next != nullptr && pre->next->val <= p->val) {
pre = pre->next;
}
p->next = pre->next;
pre->next = p;
p = r;
}
return dummy->next;
}
};
代码(9.4 二刷看解析)
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
auto dummy = new ListNode(0, head);
auto cur = dummy->next;
auto next = cur->next;
cur->next = nullptr;
cur = next;
while(cur) {
next = cur->next;
auto pre = dummy;
while(pre->next && pre->next->val < cur->val) {
pre = pre->next;
}
cur->next = pre->next;
pre->next = cur;
cur = next;
}
return dummy->next;
}
};