算法系列——排序链表(Sort List)

194 阅读1分钟

题目描述

Sort a linked list in O(n log n) time using constant space complexity.

题目链接:leetcode-cn.com/problems/so…

解题思路

这道题要求我们对链表进行排序,采用分治法的策略,递归的对链表左右两块进行排序即可。其实就是归并排序的思路。
两个重要操作
1.快慢指针分割链表
2.合并操作操作。

程序实现

class Solution {
    //分治法 采用归并排序 
    public ListNode sortList(ListNode head) {
        //终止条件
        if(head==null || head.next==null){
            return head;
        }
        ListNode slow=head;
        ListNode fast=head;
        while(fast.next!=null&& fast.next.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        // 起始点找对
        ListNode l1=head;
        ListNode l2= slow.next;
        //注意断裂 不然 死循环栈溢出
        slow.next=null; 
         l1=sortList(l1);
         l2=sortList(l2);
        return merge(l1,l2);
    }

    private ListNode merge(ListNode p1,ListNode p2){
        if(p1==null){
            return p2;
        }
        if(p2==null){
            return p1;
        }
        ListNode fakeNode=new ListNode(-1);
        ListNode p=fakeNode;
        while(p1!=null&&p2!=null){
            if(p1.val<p2.val){
                p.next=p1;
                p1=p1.next;

            }else{
                p.next=p2;
                p2=p2.next;
            }
            p=p.next;
        }
        p.next=p1!=null? p1:p2;
        return fakeNode.next;  
    }
}