Sort List
Sort a linked list in O(n log n) time using constant space complexity.
这道题我想过用直接插入,超时了。百度了一下,用的是归并排序,排序以前用的都是数组,这次用链表,不太习惯
·
1 /** 2 * Definition for singly-linked list. 3 * class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next = null; 9 * } 10 * } 11 */ 12 public class Solution { 13 public ListNode sortList(ListNode head) { 14 if(null == head || null == head.next) 15 return head; //空链表和只有一个节点的链表直接返回head 16 17 ListNode middle = getMiddle(head); //得到中点节点 18 ListNode next = middle.next; 19 middle.next = null; 20 21 return merge(sortList(head), sortList(next)); 22 } 23 24 /** 25 * 获取链表的中间位置节点,一个指针走一步,另一个指针走两步 26 * @param head 27 * @return 28 */ 29 public ListNode getMiddle(ListNode head){ 30 ListNode fast = head; 31 ListNode slow = head; 32 33 while(null != fast.next && null != fast.next.next){ 34 fast = fast.next.next; 35 slow = slow.next; 36 } 37 38 return slow; 39 } 40 41 /** 42 * 合并两个有序链表 43 * @param a 44 * @param b 45 */ 46 public ListNode merge(ListNode a, ListNode b){ 47 ListNode dummyHead = new ListNode(Integer.MIN_VALUE); 48 ListNode cur = dummyHead; 49 while(null != a && null != b){ //开始合并两个链表,放到dummyHead为头结点的链表中 50 if(a.val <= b.val){ 51 cur.next = a; 52 a = a.next; 53 } 54 else{ 55 cur.next = b; 56 b = b.next; 57 } 58 cur = cur.next; 59 }//while 60 cur.next = a != null ? a : b; 61 62 return dummyHead.next; 63 } 64 }