LeetCode Sort List(单链表归并排序)

来源:互联网 发布:如何ping ip 和端口号 编辑:程序博客网 时间:2024/05/17 07:30

题意:给出一个单链表,将其排序,要求时间复杂度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));    }}


0 0
原创粉丝点击