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