问题: 对链表进行排序
思路1:链表是顺序存储的,通过简单插入排序法。
记录以下指针:当前指针;当前指针的下一个指针;链表的第一个指针(通过头结点实现):沿着头结点找到插入的前一个位置和后一个位置。
ListNode* insertionSortList(ListNode* head) {
//链表的插入方式是 直接断开原来的链接
ListNode* dumb = new ListNode(NULL), *cur;
while(head != nullptr){
cur= head;
head = head->next;
insert(dumb, cur);
}
return dumb->next;
}
void insert(ListNode* dumb, ListNode* p){
ListNode* pre = dumb, *post = dumb->next;
while(post != nullptr && post->val <= p->val){
pre = post;
post = post->next;
}
// 前面比后面小了,直接插入
p->next = post;
pre->next = p;
}
思路2:nlogn的时间复杂度,可以尝试堆排序或者归并排序,但是O(1)空间复杂度的堆排序需要依靠随机存储方式,不适合。
所以使用归并排序。具体参考链接https://blog.csdn.net/sunxianghuang/article/details/51872360