109. 排序链表
109. 排序链表
题意
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
解题思路
常数集空间复杂度:将其转化为数组;
时间复杂度为O(nlogn):用归并排序;
实现
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def sortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head:
return None
# 转化为数组
result = []
head_tmp = head
while head_tmp:
result.append(head_tmp.val)
head_tmp = head_tmp.next
# 归并排序
result = self.merge_sort(result)
# 将排序后的结果重新填充到链表中
head_tmp = head
for i in range(len(result)):
head_tmp.val = result[i]
head_tmp = head_tmp.next
return head
def merge(self, left, right):
i, j = 0, 0
left_len, right_len = len(left), len(right)
result = []
while i < left_len and j < right_len:
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def merge_sort(self, lists):
lists_len = len(lists)
if lists_len <= 1:
return lists
center = lists_len / 2
left = self.merge_sort(lists[:center])
right = self.merge_sort(lists[center:])
return self.merge(left, right)
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法