您的位置:首页 > 编程语言 > Java开发

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java leetcode