标签:style blog http color for io
Sort a linked list in O(n log n) time using constant space complexity.
题解:实现一个链表的归并排序即可。主要分为三部分:
1.找到中点并返回的函数findMiddle;
2.归并函数merge;
3.排序函数sortList。
数组的findMiddle函数非常容易实现,链表就有一点tricky了。首先设置两个指针,一个slow初始化为head,一个fast初始化为head.next,然后slow一次走一步,fast一次走两步,那么当fast达到终点的时候,slow就正好到达中点了。
merge函数很简单,就是每次比较两个链表头结点的大小,把较小的拿过来放在新链表后面。
sortList是一个递归的函数,分别递归的排序[head,mid]和[mid.next,tail]之间的元素,然后把它们归并。
代码如下:
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 private ListNode findMiddle(ListNode head){ 14 ListNode slow = head; 15 ListNode fast = head.next; 16 while(fast != null && fast.next != null){ 17 slow = slow.next; 18 fast = fast.next.next; 19 } 20 return slow; 21 } 22 private ListNode merge(ListNode head1,ListNode head2){ 23 if(null == head1) 24 return head2; 25 if(null == head2) 26 return head1; 27 ListNode head; 28 if(head1.val > head2.val){ 29 head = head2; 30 head2 = head2.next; 31 } 32 else{ 33 head = head1; 34 head1 = head1.next; 35 } 36 ListNode tail = head; 37 while(head1 != null && head2 != null){ 38 if(head1.val > head2.val){ 39 tail.next = head2; 40 head2 = head2.next; 41 } 42 else{ 43 tail.next = head1; 44 head1 = head1.next; 45 } 46 tail = tail.next; 47 } 48 if(head1 != null) 49 tail.next = head1; 50 if(head2 != null) 51 tail.next = head2; 52 return head; 53 } 54 public ListNode sortList(ListNode head) { 55 if(head == null || head.next == null) 56 return head; 57 ListNode mid = findMiddle(head); 58 ListNode right = sortList(mid.next); 59 mid.next = null; 60 ListNode left = sortList(head); 61 62 return merge(left,right); 63 } 64 }
在人人上看到一个很好的汇集leetcode答案的网站:http://answer.ninechapter.com/,据说是google和facebook等工程师给出的答案,可以学习一下。
【leetcode刷题笔记】Sort List,布布扣,bubuko.com
标签:style blog http color for io
原文地址:http://www.cnblogs.com/sunshineatnoon/p/3842857.html