Leetcode: Sort List

本文介绍了一种使用常数空间复杂度在O(nlogn)时间内对链表进行排序的方法。通过采用归并排序的思想,利用runner technique将链表分成两半,递归地排序每一半,然后合并两个有序链表。
Sort a linked list in O(n log n) time using constant space complexity.

 记得Insert Sort List, 那个复杂度是O(N^2)的,这里要求O(nlogn),所以想到merge sort, 需要用到Merge Two Sorted List的方法(我写的merge函数)

第二遍代码:所以mergesort不好写在于它是一个递归里嵌套另一个递归,第一个递归不停地用runner technique把list分两段,直到每一段是一个或0个节点返回该点,这时再调用merge Two sorted List递归把两段整合起来,返回它们的首节点

 1 public class Solution {
 2     public ListNode sortList(ListNode head) {
 3         if (head == null || head.next == null) return head;
 4         return mergesort(head);
 5     }
 6     
 7     public ListNode mergesort(ListNode head) {
 8         if (head == null || head.next == null) return head;
 9         ListNode dummy = new ListNode(-1);
10         dummy.next = head;
11         ListNode walker = dummy;
12         ListNode runner = dummy;
13         while (runner!=null && runner.next!=null) {
14             runner = runner.next.next;
15             walker = walker.next;
16         }
17         ListNode head1 = dummy.next;
18         ListNode head2 = walker.next;
19         walker.next = null;
20         return merge(mergesort(head1), mergesort(head2));
21     }
22     
23     public ListNode merge(ListNode head1, ListNode head2) {
24         if (head1 == null) return head2;
25         if (head2 == null) return head1;
26         ListNode dummy = new ListNode(-1);
27         dummy.next = head1;
28         ListNode pre = dummy;
29         while (head1 != null && head2 != null) {
30             if (head1.val <= head2.val) {
31                 head1 = head1.next;
32             }
33             else {
34                 ListNode next = head2.next;
35                 head2.next = pre.next;
36                 pre.next = head2;
37                 head2 = next;
38             }
39             pre = pre.next;
40         }
41         if (head2 != null) {
42             pre.next = head2;
43         }
44         return dummy.next;
45     }
46 }

 

转载于:https://www.cnblogs.com/EdwardLiu/p/3978383.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值