LeetCode-Sort List
来源:互联网 发布:win10 64位下载 知乎 编辑:程序博客网 时间:2024/06/10 02:17
LeetCode-Sort List
题目描述如下:
Sort a linked list in O(n log n) time using constant space complexity.
解题思路:
即找一个时间复杂度为O(nlogn)的基于链表的排序算法,那么,只有归并排序符合要求。快速排序之类的排序算法都需要随机访问能力,链表不符合要求。
然后按照一般的递归归并排序来看,其要占用O(n)的空间,因为采用的是链表数据结构,故可以优化成O(1),就是在合并的时候让两个链表指来指去,最后连成串就好。
tip1:
把一个链表一分为二的小技巧(百度的。。)
如果按照常规思路,需要先遍历链表一边,得到链表长度N,然后从头再走N/2步,进而得到链表的中间节点。
一种较为快速的方法如下(双指针法):
即设置双指针,初始都指向头结点,然后一个每次走1步,另一个每次走2步,当快的指针将要达到或者已经达到链表末尾时,慢指针指向的就是链表的中间节点。
tip2:
此算法另一个比较好的地方在于(也是百度到的。。)
在merge时,先将两个链表拆分成两个独立的链表,这样避免了合并时还要考虑长度的麻烦,直接用ptr==null来判定是否合并完成即可。
ps:最开始我用的迭代的归并算法,思路很清晰,但是边界条件判定巴拉巴拉之类的略麻烦,没有实现成功。
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { //将两个有序链表合并,使用常量空间 public ListNode merge(ListNode fptr, ListNode sptr) { //自己多加一个临时头指针 ListNode tempHead = new ListNode(-1); ListNode current = tempHead; while(null != fptr && null != sptr) { if(fptr.val < sptr.val) { current.next = fptr; fptr = fptr.next; } else { current.next = sptr; sptr = sptr.next; } current = current.next; } current.next = (fptr == null)? sptr : fptr; //返回头指针 return tempHead.next; } //寻找链表的中间节点 //采用快慢指针法,这个是寻找链表中间节点比较快的方法,避免了两次遍历 public ListNode findM(ListNode ptr) { ListNode slow = ptr; ListNode fast = ptr; while(null != fast.next && null != fast.next.next) { slow = slow.next; fast = fast.next.next; } return slow; } public ListNode sortList(ListNode head) { if(null == head || null == head.next) { return head; } ListNode middle = findM(head); ListNode next = middle.next; middle.next = null; return merge(sortList(head),sortList(next)); }}
0 0
- [leetcode][list][sort] Sort List
- Insertion Sort List | leetcode
- Leetcode: Insertion Sort List
- [LeetCode] Insertion Sort List
- Leetcode: Insertion Sort List
- Leetcode: Sort List
- Sort List | leetcode
- leetcode-Sort List
- leetcode-Insertion Sort List
- LeetCode题解:Sort List
- leetcode 134: Sort List
- [LeetCode]Sort List
- [LeetCode]Insertion Sort List
- [LeetCode] Sort List
- 【LeetCode】Insertion Sort List
- leetCode - Sort List
- LeetCode | Insertion Sort List
- LeetCode - Insertion Sort List
- CF_292_D_ Drazil and Tiles_贪心、dfs
- Tyvj专题 P1337 fibonacci数列
- VC++动态链接库(DLL)编程深入浅出(zz)
- 【JAVA实现】基于皮尔逊相关系数的相似度计算
- HDU 5176 The Experience of Love (带权并查集 + 贪心)
- LeetCode-Sort List
- Android代码混淆指南
- 数据结构复习_栈和队列,应用_括号匹配&文件目录递归拷贝,
- activity状态保存讲解一
- javase_IO
- 6 MediaPlayer 炸弹 换刀
- 为Eclipse安装SVN插件
- 电商发展趋势与互联网创业思考
- 极简版算账软件