单链表排序--插入排序

/**

    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 如何输出链表呀 这个我不清楚 有知道的吗?

我在本机测试了

转载于:https://my.oschina.net/woyaoxue/blog/549332

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值