问题:
- 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
- 示例 1:
- 输入: 4->2->1->3
- 输出: 1->2->3->4
- 示例 2:
- 输入: -1->5->3->4->0
- 输出: -1->0->3->4->5
代码实现
public class 排序链表 {
public static void main(String[] args) {
ListNode node1=new ListNode(-1);
ListNode node2=new ListNode(5);
ListNode node3=new ListNode(3);
ListNode node4=new ListNode(4);
ListNode node5=new ListNode(0);
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node5;
show(sorted(node1));
}
public static void show(ListNode node){
ListNode h=node;
while(h!=null){
System.out.println(h.val);
h=h.next;
}
}
public static ListNode sorted(ListNode node){
//如果node只有一个节点或则node为空,则返回当前Node
if(node==null||node.next==null){
return node;
}
//定义一个快指针,一个慢指针
ListNode fast=node.next;
ListNode slow=node;
//寻找node的中间节点
//因为fast=2*slow slow最后定位到的位置为链表中间的位置
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
//将链表分割为两部分,实现分治算法中的分
//新建temp链表为slow右边的两边
ListNode temp=slow.next;
//将slow右边置为空,实现将链表分为两部分
slow.next=null;
//递归实现分治算法中的分
ListNode left=sorted(node);
ListNode right=sorted(temp);
//新建一个链表用于存储排序后的链表
ListNode h=new ListNode(0);
ListNode res=h;
//实现分治算法中的治,即合并链表
while(left!=null&&right!=null){
if(left.val<right.val){
h.next=left;
//left后移
left=left.next;
}else{
h.next=right;
//right后移
right=right.next;
}
h=h.next;
}
//如果left或者right中还有节点没有遍历完
h.next=(left!=null)?left:right;
return res.next;
}
}
class ListNode{
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
实现结果
-1
0
3
4
5