排序链表

Posted Efve

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序链表相关的知识,希望对你有一定的参考价值。

中英题面

  在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

  Sort a linked list in O(n log n) time using constant space complexity.

  示例 1:

  输入: 4->2->1->3
  输出: 1->2->3->4

  Example 1:

  Input: 4->2->1->3
  Output: 1->2->3->4

  示例 2:

  输入: -1->5->3->4->0
  输出: -1->0->3->4->5

  Example 2:

  Input: -1->5->3->4->0
  Output: -1->0->3->4->5  



算法

  直接套用归并排序的思想,为了方便与节省空间,牺牲了一些常数时间。
  时间复杂度:
    O(NlogN)
  空间复杂度:
    O(1)

 
代码
 1 # Definition for singly-linked list.
 2 # class ListNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.next = None
 6 
 7 class Solution:
 8     def sortList(self, head):
 9         """
10         :type head: ListNode
11         :rtype: ListNode
12         """
13         if (not head):
14             return None
15         if (not head.next):
16             return head
17         hen = tai = tail = head
18         while (tai.next):
19             tai = tai.next
20             if (tai.next):
21                 tail = tail.next
22             else:
23                 break
24             tai = tai.next
25         self.adjust(head, tai)
26         hen = tail.next
27         tail.next = None
28         self.adjust(head, tail)
29         self.adjust(hen, tai)
30         self.sortList(head)
31         self.sortList(hen)
32         i = head
33         while (hen):
34             if (i.next):
35                 if (i.next.val > hen.val):
36                     hen.next, i.next, hen = i.next, hen, hen.next
37                 i = i.next
38             else:
39                 i.next = hen
40                 break
41         return head
42 
43     def adjust(self, head, tail):
44         i = head
45         while (i.next):
46             if (head.val > i.next.val):
47                 head.val, i.next.val = i.next.val, head.val
48             if (tail.val < i.next.val):
49                 tail.val, i.next.val = i.next.val, tail.val
50             i = i.next

 

以上是关于排序链表的主要内容,如果未能解决你的问题,请参考以下文章

常见的链表排序(Java版)

代码的鲁棒性:合并两个排序的链表

代码模板实现双向链表的去重拼接合并排序

25 合并两个排序的链表(第3章 高质量的代码-代码的鲁棒性)

链表归并排序

链表归并排序