此题目对应于LeetCode 148
题目要求:
Sort a linked list in O(n log n) time using constant space complexity.
用O(n log n) 的排序算法,很容易让人想到用递推去做。
思路就是将单链表一分为二划分成两个子问题,然后递归调用算法,最后在做一个对两个
有序的单链表的合并操作(O(n))。
按照主定理:
T(n) = 2T(n/2) + n
则 T(n) = n = f(n), 则 T(n) = O(nlogn)
单链表一分为二就直接从单链表中间划分
下面附上python代码:
class ListNode:
def __init__(self,x):
self.val=x
self.next=None
def mergeTwoLists(self, l1, l2):#合并两个有序的链表
if not l1:
return l2
if not l2:
return l1
prenode = ListNode(1)
p = prenode
while l1 and l2:
if l1.val <= l2.val:
p.next = l1
l1 = l1.next
else:
p.next = l2
l2 = l2.next
p = p.next
if l1:
p.next = l1
if l2:
p.next = l2
return prenode.next
def sortList(self, head):
if not head or not head.next:
return head
prenode = head
p1 = prenode
p2 = prenode
l = 0
while p1:
l += 1
p1 = p1.next
mid = l/2
k = 0
l1 = prenode
while p2: # 将单链表从中间一分为二
if k >= mid-1:
tmp = p2.next
p2.next = None
l2 = tmp
break
else:
p2 = p2.next
k += 1
t1 = self.sortList(l1)
t2 = self.sortList(l2)
return self.mergeTwoLists(t1,t2)