leetcode题解Java | 148. Sort List
2017-02-22 19:37
459 查看
题目:https://leetcode.com/problems/sort-list/?tab=Description
Sort a linked list in O(n log n)
time using constant space complexity.
分析:
这是一道二路归并的题目。其核心思想是把整条数链一直二分,分到只有一个元素为止,然后开始把有序的段两两归并。把一个链表存储的数列二分,可用快慢点法。即快节点一次移动两个节点,慢节点一次移动一个节点,当快节点头尾的时候,慢节点的位置正好是一半。
对于n个数和n个数的段的归并,其比较次数为O(n),而一个n元素的链总共需要归并的次数为logn,所以时间复杂度为O(nlongn)。
Java实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
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)
{
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
if(pre!=null)
pre.next = null;
ListNode left = sortList(head);
ListNode right = sortList(slow);
return merge(left,right);
}
public ListNode merge(ListNode left, ListNode right)
{
ListNode head = new ListNode(0);
ListNode p = head;
while(left!=null && right!=null)
{
if(left.val < right.val)
{
p.next = left;
p = p.next;
left = left.next;
p.next = null;
}
else
{
p.next = right;
p = p.next;
right = right.next;
p.next = null;
}
}
if(left!=null)
p.next = left;
if(right!=null)
p.next = right;
return head.next;
}
}
Sort a linked list in O(n log n)
time using constant space complexity.
分析:
这是一道二路归并的题目。其核心思想是把整条数链一直二分,分到只有一个元素为止,然后开始把有序的段两两归并。把一个链表存储的数列二分,可用快慢点法。即快节点一次移动两个节点,慢节点一次移动一个节点,当快节点头尾的时候,慢节点的位置正好是一半。
对于n个数和n个数的段的归并,其比较次数为O(n),而一个n元素的链总共需要归并的次数为logn,所以时间复杂度为O(nlongn)。
Java实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
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)
{
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
if(pre!=null)
pre.next = null;
ListNode left = sortList(head);
ListNode right = sortList(slow);
return merge(left,right);
}
public ListNode merge(ListNode left, ListNode right)
{
ListNode head = new ListNode(0);
ListNode p = head;
while(left!=null && right!=null)
{
if(left.val < right.val)
{
p.next = left;
p = p.next;
left = left.next;
p.next = null;
}
else
{
p.next = right;
p = p.next;
right = right.next;
p.next = null;
}
}
if(left!=null)
p.next = left;
if(right!=null)
p.next = right;
return head.next;
}
}
相关文章推荐
- leetcode_效率题解_148. Sort List_(链表归并排序)
- LeetCode 148. Sort List(java)
- [Leetcode] Sort List (Java)
- Sort List leetcode java
- Leetcode: Sort List (Java)
- <LeetCode OJ> 148. Sort List
- LeetCode题解——Sort List
- LeetCode 147 — Insertion Sort List(C++ Java Python)
- [LeetCode]148.Sort List
- Java for LeetCode 147 Insertion Sort List
- leetcode: Sort List, Merge sort solution. Java
- 【LeetCode-面试算法经典-Java实现】【147-Insertion Sort List(链表插入排序)】
- 【Leetcode】Sort List in java,你绝对想不到我是怎么做的^^我写完过了我自己都觉得好jian~
- Java for LeetCode 148 Sort List
- LeetCode题解:Sort List
- Insertion Sort List Leetcode java
- LeetCode:Sort List (Java)
- 【Leetcode】Sort List JAVA实现
- LeetCode234_PalindromeLinkedList (判断是否为回文链表) Java题解
- [leetcode] 148.Sort List