题目描述:
Sort a linked list in O(n log n) time using constant space complexity.
对链表进行归并排序
思路解析:
- 归并排序的思想:比较大小,把小的先进行排序,剩下的再直接放入。
- 找到链表中间点的方法,也就是分为两个list:firstlist和secondlist
- 递归分解两个list,然后Merge
- Merge的过程需要新建节点:ListNode fakelist = new ListNode(-1);ListNode curr = fakelist;
代码:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if(head==null||head.next==null)
return head;
ListNode slow=head,fast=head,firstlist=head;
while(fast.next!=null&&fast.next.next!=null){
slow=slow.next;
fast=fast.next.next;
}
ListNode secondlist = slow.next;
slow.next=null;
return mergeTwoLists(sortList(firstlist),sortList(secondlist));
}
public ListNode mergeTwoLists(ListNode leftlist,ListNode rightlist){
if(leftlist == null)
return null;
if(rightlist == null)
return null;
ListNode fakehead = new ListNode(-1);
ListNode curr = fakehead;
while(leftlist!=null && rightlist!=null){
if(leftlist.val<=rightlist.val){
curr.next = leftlist;
leftlist=leftlist.next;
}else{
curr.next = rightlist;
rightlist = rightlist.next;
}
curr= curr.next;
}
curr.next = leftlist!=null?leftlist:rightlist;
return fakehead.next;
}
}