/**
https://leetcode.com/problems/sort-list/
Sort a linked list in O(n log n) time using constant space complexity.
Hide Tags Linked List Sort
Hide Similar Problems (E) Merge Two Sorted Lists (M) Sort Colors (M) Insertion Sort List
单链表:顺序遍历 只能相邻比较比较,
1 冒泡排序 --顺序遍历 两两比较 --- o(n*n) -----------满足
2 插入排序 假如i之前的是有序 ,i之后的是无序 相邻比较 顺序遍历 o(n*n)---满足
3 快速排序 选取一个参考点,然后两端数据比较交换, 无法实现 --操作 O(n log n) ---不满足
3 堆排序: 假如i是但其位置 下一个左孩子位置2i O(n log n) -----不满足
4 归并排序:两两合并
有序数组a和有序数组b
合并成数组c 有序数组的遍历操作是顺序进行的
性能:时间:O(n log n) 空间o(n)
------------满足
满足要求 4 归并排序 能写出来吗 如果不能就用 1和2
从简单实现开始:
插入排序:
插入排序:
步骤1 插入排序 控制逻辑 判断i 和 i+1 位置大小
步骤2
将一个数据插入到有序数组中,
如果是数组的话 需要移动后面位置--数组缺点
list可以直接交换位置 移动指针
实现出现过的错误:
1 end=curl 放到最后的话 有continue 回跳过
2 begin++;//地址不是连续的无法继续执行++操作
3 curl->next=temp; curl=curl->next
for(;curl!=NULL;end=curl,curl=curl->next) 是否有问题?
4 core.3452 --死循环
begin!=NULL&&begin!=end;
curl->next!=NULL 如果是最后一个就不再在比较
(gdb) p begin
$2 = (ListNode *) 0x603030
(gdb) p end
$3 = (ListNode *) 0x603030
begin<=end vs begin!=end
指针比较大小
5 链表的遍历 curl!=NULL vs curl->next !=NULL
curl->next最后一个节点访问不到
5 有序单链表中 如何插入一个新节点
(10,20) new
比较大小:
if(curl->val > begin->next->val)
**/
struct ListNode* sortList2(struct ListNode* head)
{
//需要四个临时变量
ListNode* begin=head; //有序数组中开始位置
ListNode* end=head->next;//有序数组结束位置 初始化第一个元素有序
ListNode* curl=head->next->next;//无顺数组开始位置
ListNode* temp;//有序数组中插入新元素的位置
for(;curl!=NULL;end=curl,curl=curl->next)
{ //有序数组结束位置 和无顺数组开始位置比较
if(curl->val > end->val)
{
continue;
}
// 移除curl
if(curl->next!=NULL)
{
end->next=curl->next;
}else
{
end->next=NULL;
}
for(begin=head;begin!=NULL&&begin<=end;begin=begin->next)
{ //从有序数组开始位置查找
if(curl->val > begin->next->val)
{
continue;
}else
{
curl->next=begin->next;
begin->next=curl;
showAll(head);
break;
}
}
curl=end;//重新排序之后 cur和cur-next 已经不再无序数组内了
showAll(head);
}
}
如果有问题请加入qq群讨论:234303445
问题:
Custom Testcase 如何输出链表呀 这个我不清楚 有知道的吗?
我在本机测试了