码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode刷题笔记】Sort List

时间:2014-07-14 20:00:56      阅读:182      评论:0      收藏:0      [点我收藏+]

标签: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

【leetcode刷题笔记】Sort List

标签:style   blog   http   color   for   io   

原文地址:http://www.cnblogs.com/sunshineatnoon/p/3842857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!