mfc链表中的数据如何排序输出_每日一题2 (leetcode)-对链表进行插入排序

ba0a82a0955e31bfbc8915c26b4ecc49.png

leetcode-147. 对链表进行插入排序

 对链表进行插入排序

示例 1:

输入: 4->2->1->3

输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0

输出: -1->0->3->4->5

分析

保障正确性-o(n2) ,类似链表翻转,后面数据插入到前面

文字描述:

  1. 遍历链表,第一个元素默认是有序的
  2. 在遍历过程中 记录,
  3. 有序链表 开始位置: 是否固定下来
2b0005f6d814be59d43bfd1e4a9a4530.png
  1. head是否改变2个方式
  2. 在遍历过程中 记录,
  3. 结束位置 : 如果有序,怎么办 ? 如果无顺序怎么办?
  4. 约束条件是什么?
  5. 寻找插入位置

code

class Solution {public: ListNode* insertionSortList(ListNode* head) { //基本合法检查,还不涉及排序过程 if(head == NULL || head->next == NULL) { return head; } //01 依赖空间  ListNode first(0); //有序链表头开始部分,固定头节点位置,保证插入节点元素 pre节点一定存在。 first.next=head; //第一默认有序 head->6->5->1->8 ListNode* cur = head; // 有序链表头结束部分 ListNode* pre = NULL;//插入排序需要插入记录位置,每次都需要重新计算 //从第一个元素开始遍历链表,假设第一个元素是有序的 while(cur) { //满足条件 1-8 if(cur->next &&cur->next->val val) { //寻找插入位置 . pre=&first;//从有序链表head开始遍历.次数,pre 指向head节点,没有数据 while(cur->next&&pre->next && cur->next->val>pre->next->val) // head->6->5->1->8 { pre=pre->next;//pre->next 就是插入地方。pre是前面一个节点。存在插入规则,是在固定节点后面插入 } // pre next 就是插入地方) ListNode* temp = cur->next; //记录待插入元素5,head->6->5->1 cur->next=temp->next; //移除待插入元素5 ,移动下一个元素 head->6->1 temp->next =pre->next;//待插入元素5后面节点。  // 5 ->6->1  // head->6->1  pre->next=temp;//待插入元素5前面节点。 head->5->6->1 //这里不需要一定cur=cur->next,移动下一个元素 head->6->1 完成 }else { cur=cur->next;//移动下一个元素 }  } return first.next; }};

总结

链表这样结构 必须定义 固定开始节点和结束节点

这样方面插入

977e8e0e68ec98a70a9e956f517ada60.png

翻转部分链表vs插入排序

耗时 4个小时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值