问题: 对链表进行排序
思路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.youkuaiyun.com/sunxianghuang/article/details/51872360
本文介绍两种链表排序方法:插入排序和归并排序。插入排序适用于顺序存储结构,通过不断插入节点来完成排序。归并排序采用分治策略,利用递归将链表分为两部分,分别排序后再合并。
5457

被折叠的 条评论
为什么被折叠?



