题目:
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
进阶:
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
示例:
思路:
归并排序的时间复杂度是O(n log n),采用了分治思想,如下图(出自这篇文章)
所以“分割”与“合并”可以采用递归来实现。
- 使用快慢指针法找到链表的中点位置,即,慢指针每次移动一步,快指针每次移动两步。
- 找到中点位置后,可以把链表分成两个子链表。
- 对两个子链表分别排序。
- 然后合并两个有序序链表。
递归程序我们希望返回的是已经排序好的链表
合并两个排序链表可以采用 这道题 的做法,也是递归实现。
代码:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def sortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
# 合并两个有序链表
def mergeTwoLists(l1, l2):
if not l1:
return l2
if not l2:
return l1
if l1.val < l2.val:
l1.next = mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = mergeTwoLists(l1, l2.next)
return l2
if not head or not head.next:
return head
# 找到链表中点
low = head
fast = head
while fast.next and fast.next.next:
low = low.next
fast = fast.next.next
mid = low.next
low.next = None
# 继续分割
left = self.sortList(head)
right = self.sortList(mid)
# 排序
return mergeTwoLists(left, right)