leetcode经典例题第四题,对链表进行排序。
题目描述
Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0
Output: -1->0->3->4->5
解题思路
最近忙着追《都挺好》,差点忘记每天的任务。这一题要求时间复杂度为O(n log n) 并且用常数级别的空间复杂度。对于链表这种数据结构,不像数组那么方便,因此堆排序以及快速排序不是很方便,因此这一题用归并排序比较合适,并且对于本题,空间上不需要用数组来存储,因此是常数级别的。
代码提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| class Solution { public ListNode sortList(ListNode head) { if(head == null || head.next == null){ return head; } ListNode pre = null; ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null){ pre = slow; slow = slow.next; fast = fast.next.next; } pre.next = null; ListNode l1 = sortList(head); ListNode l2 = sortList(slow); return merge(l1,l2); } private ListNode merge(ListNode l1,ListNode l2){ ListNode tmp = new ListNode(0); ListNode p = tmp; while(l1!=null && l2!=null){ if(l1.val < l2.val){ p.next = l1; l1 = l1.next; }else{ p.next = l2; l2 = l2.next; } p = p.next; } if(l1 != null){ p.next = l1; } if(l2 != null){ p.next = l2; } return tmp.next; } }
|