leetcode-147. 对链表进行插入排序
对链表进行插入排序
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
分析
保障正确性-o(n2) ,类似链表翻转,后面数据插入到前面
文字描述:
- 遍历链表,第一个元素默认是有序的
- 在遍历过程中 记录,
- 有序链表 开始位置: 是否固定下来
- head是否改变2个方式
- 在遍历过程中 记录,
- 结束位置 : 如果有序,怎么办 ? 如果无顺序怎么办?
- 约束条件是什么?
- 寻找插入位置
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; }};
总结
链表这样结构 必须定义 固定开始节点和结束节点
这样方面插入
耗时 4个小时。