Description
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Solution
- 先用快慢指针把链表递归的拆成两部分。
- 把两部分merge成一个链表,返回merge后链表的头结点。
class Solution:
def sortList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
slow = head
fast = head
# 用快慢指针分成两部分
while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
# 找到左右部分, 把左部分最后置空
mid = slow.next
slow.next = None
# 递归下去
left = self.sortList(head)
right = self.sortList(mid)
# 合并
return self.merge(left, right)
def merge(self, left, right):
dummy = ListNode(0)
p = dummy
l = left
r = right
while l and r:
if l.val < r.val:
p.next = l
l = l.next
p = p.next
else:
p.next = r
r = r.next
p = p.next
if l:
p.next = l
if r:
p.next = r
return dummy.next
# 作者:jhhuang
# 链接:https://leetcode-cn.com/problems/sort-list/solution/lc148-jian-ji-pythongui-bing-shi-xian-by-jhhuang/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。