排序
①遍历链表,当前遍历的结点记作
p
p
p 。
②从前往后遍历链表,找到最后一个值小于
p
p
p 的结点
c
u
r
cur
cur 。
③(关键操作) 插入,如图,将
p
p
p 插入
c
u
r
cur
cur 的后面。
p->next = cur->next;
cur->next = p;
p = next;
区分指针 n e x t next next 和 变量 n e x t next next 。指针 n e x t next next 是结点的后继,变量 n e x t next next 是①遍历的下一个位置。
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
auto dummy = new ListNode(-1);
for(auto p = head;p;){
auto cur = dummy;
while(cur->next&&cur->next->val<=p->val) cur = cur->next;
auto next = p->next;
p->next = cur->next;
cur->next = p;
p = next;
}
return dummy -> next;
}
};
- 时间复杂度 : O ( n 2 ) O(n^2) O(n2) , n n n 是链表长度, 插入排序的时间复杂度 O ( n ) O(n) O(n) 。
- 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常数级空间 。
AC
致语
- 理解思路很重要
- 读者有问题请留言,清墨看到就会回复的。