148. Sort List (java 给单链表排序)
2016-08-13 20:32
375 查看
题目:Sort a linked list in O(n log n) time using constant space complexity.
分析:给单链表排序,要求时间复杂度是O(nlogn),空间复杂度是O(1)。时间复杂度为O(nlogn)的排序算法有快速排序和归并排序,
但是,对于单链表来说,进行元素之间的交换比较复杂,但是连接两个有序链表相对简单,因此这里采用归并排序的思路。
编码:
分析:给单链表排序,要求时间复杂度是O(nlogn),空间复杂度是O(1)。时间复杂度为O(nlogn)的排序算法有快速排序和归并排序,
但是,对于单链表来说,进行元素之间的交换比较复杂,但是连接两个有序链表相对简单,因此这里采用归并排序的思路。
编码:
public ListNode sortList(ListNode head) { if(head == null || head.next == null) return head; //找到链表的中间节点,一快一慢两个指针 ListNode fast = head; ListNode slow = head; ListNode pre = null; //记录第一部分的最后一个节点 //将单链表划分为两部分 while(fast != null && fast.next != null){ fast = fast.next.next; pre = slow; slow = slow.next; } //将两部分分割开 if(pre != null) pre.next = null; //分别对两部分递归排序 ListNode l1 = sortList(head); ListNode l2 = sortList(slow); return merge(l1,l2); //归并 } //归并两个有序序列 public ListNode merge(ListNode l1,ListNode l2){ if(l1 == null) return l2; if(l2 == null) return l1; ListNode l = new ListNode(-1); ListNode newHead = l; while(l1 != null && l2 != null){ if(l1.val < l2.val){ newHead.next = l1; //这里利用单链表的性质,不使用额外的空间,使得空间复杂度为O(1) l1 = l1.next; newHead = newHead.next; } else { newHead.next = l2; l2 = l2.next; newHead = newHead.next; } } if(l1 != null) newHead.next = l1; if(l2 != null) newHead.next = l2; return l.next; }
相关文章推荐
- LeetCode 148. Sort List--O(nlogn)时间复杂度和常数空间复杂度给链表排序
- LeetCode 148. Sort List(链表排序)
- 148. Sort List 链表排序(C++)
- LeetCode147_Insertion Sort List(用插入排序算法对链表进行排序) Java题解
- LeetCode-147. Insertion Sort List (JAVA)链表插入排序
- LeetCode 148. Sort List 单链表排序 Python Solution
- LeetCode 148.Sort List 链表排序
- [LeetCode] 148. Sort List 链表排序
- leetcode解题之148. Sort List Java版(对链表排序)
- java List 排序 Collections.sort() 对 List 排序
- java List Collections.sort 排序 支持 对象属性 普通数据类型
- java List 排序 Collections.sort() 对 List 排序
- 用Java集合中的Collections.sort方法对list排序的两种方法
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- java List 排序 Collections.sort() 对 List 排序
- 120941138:java list sort()排序各种方式,实现接口
- java List 排序 Collections.sort
- (好使)用Java集合中的Collections.sort方法对list排序的两种方法
- java List 排序 Collections.sort() 对 List 排序
- java List 排序 Collections.sort() 对 List 排序