题意:给出一个单链表,将其排序,要求时间复杂度O(nlgn)
思路:用归并排序,取链表的一半,在取一半时,不用先计算总结点个数,一个每次走两步,一个每次走一步,当走的快的结束是,慢的已经到总结点的一半了
代码如下:
class Solution
{
private ListNode mergeListNode(ListNode l1, ListNode l2)
{
if (null == l1) return l2;
else if (null == l2) return l1;
ListNode p1 = l1, p2 = l2;
ListNode ans = null, tail = null;
while (l1 != null && l2 != null)
{
if (l1.val < l2.val)
{
if (tail == null)
{
ans = tail = l1;
}
else
{
tail.next = l1;
tail = tail.next;
}
l1 = l1.next;
}
else
{
if (null == tail)
{
ans = tail = l2;
}
else
{
tail.next = l2;
tail = tail.next;
}
l2 = l2.next;
}
}
if (l1 != null) tail.next = l1;
else if (l2 != null) tail.next = l2;
return ans;
}
public ListNode sortList(ListNode head)
{
if (null == head || null == head.next) return head;
ListNode fast = head.next, slow = head;
while (fast != null && fast.next != null)
{
fast = fast.next.next;
slow = slow.next;
}
ListNode p = slow.next;
slow.next = null;
return mergeListNode(sortList(head), sortList(p));
}
}