使用插入算法排序链表,leetcode
2016-12-13 16:50
323 查看
这是我最开始的想法,我大概花了一个小时才做出来,太慢了,我的思路是使用递归的方法,从后面往前面排序,比如:2,3,1 第一次递归变为 : 2,1,3 ,第二次递归变为:1,2,3 。但是时间花得太久了,80ms左右;
最后在discuss中发现了这个方法,惊为天人,这个方法是先申请一个辅助点newhead,newhead的下一个节点就是head,先预先判断一次head是否是顺序,当顺序时O(n),当有一个点不是顺序时,将这个点重新排序,并在原来的地点删除这个点,链表直接插入就可以了,但是如果是数组就得按我的方法,一个一个移动已经排好序的节点:
class Solution { public: ListNode* insertionSortList(ListNode* head) { if(head == NULL || head->next == NULL) { return head; } ListNode* rest = insertionSortList(head->next); ListNode* current = head; int cur = head->val; while(rest != NULL && cur > rest->val) { current->val = rest->val; current = current->next; rest = rest->next; } current->val = cur; return head; } };
最后在discuss中发现了这个方法,惊为天人,这个方法是先申请一个辅助点newhead,newhead的下一个节点就是head,先预先判断一次head是否是顺序,当顺序时O(n),当有一个点不是顺序时,将这个点重新排序,并在原来的地点删除这个点,链表直接插入就可以了,但是如果是数组就得按我的方法,一个一个移动已经排好序的节点:
class Solution { public: ListNode* insertionSortList(ListNode* head) { ListNode* new_head = new ListNode(0); new_head -> next = head; ListNode* pre = new_head; ListNode* cur = head; while (cur) { if (cur -> next && cur -> next -> val < cur -> val) { while (pre -> next && pre -> next -> val < cur -> next -> val) pre = pre -> next; /* Insert cur -> next after pre.*/ ListNode* temp = pre -> next; pre -> next = cur -> next; cur -> next = cur -> next -> next; pre -> next -> next = temp; /* Move pre back to new_head. */ pre = new_head; } else cur = cur -> next; } ListNode* res = new_head -> next; delete new_head; return res; } };
相关文章推荐
- LeetCode-Insertion Sort List-链表插入排序-链表操作
- 【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】
- leetcode之链表类之链表排序-----147/148. 链表快速排序 链表插入排序
- [LeetCode] Insertion Sort List 链表插入排序
- [LeetCode] Insertion Sort List 单向链表插入排序
- 每天一道LeetCode-----链表插入排序
- [Leetcode] insertion sort list 链表插入排序
- 【算法之链表(三)】单链表中,在仅允许使用一个指针的情况下,在指定的节点前面插入以及删除一个节点
- leetcode 147. Insertion Sort List-链表插入排序
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- [leetcode]单链表插入排序
- LeetCode Insertion Sort List 链表插入排序
- [LeetCode]85. Insertion Sort List链表插入排序
- [LeetCode]147 链表插入排序
- leetcode 92. Reverse Linked List II 反转链表 + 头插入反转链表(或者使用栈)
- LeetCode-147. Insertion Sort List (JAVA)链表插入排序
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- 算法-链表排序(冒泡、选择、插入)
- 【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】
- LeetCode-Sort List,链表排序(插入和归并),时间复杂度O(n^2) and O(nlgn)