题目描述
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;
}
}