题目

代码分析

按照数组归并排序的方式来完成链表,注意base case对于空的判断,快慢指针的应用

代码实现

class Solution {
    public ListNode sortList(ListNode head) {
        ListNode end=head;
        while(end!=null)
        {
            end=end.next;
        }
        return f(head,end);
    }

    public ListNode f(ListNode start,ListNode end)
    {
        if(start==null||start==end)
        {
            return start;
        }
        ListNode fast=start;
        ListNode slow=start;
        while(fast.next!=null&&fast.next.next!=null)
        {
            fast=fast.next.next;
            slow=slow.next;
        }
        ListNode temp=slow.next;
        slow.next=null;
        ListNode cur1=f(start,slow);
        if(fast.next!=null)
        {
            fast=fast.next;
        }
        ListNode cur2=f(temp,fast);
        ListNode res = merge(cur1, cur2);
        return res;
    }
    public ListNode merge(ListNode cur1,ListNode cur2)
    {
        ListNode res=new ListNode(-1);
        ListNode temp=res;
        ListNode next=null;
        while(cur1!=null&&cur2!=null)
        {
            if(cur1.val<cur2.val)
            {
                next=cur1.next;
                res.next=cur1;
                res=res.next;
                cur1=next;
            }else
            {
                next=cur2.next;
                res.next=cur2;
                res=res.next;
                cur2=next;
            }
        }
        if(cur1!=null)
        {
            res.next=cur1;
        }else if(cur2!=null)
        {
            res.next=cur2;
        }
        return temp.next;
    }
}

学习情况

1次