排序链表
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表
采用归并排序的方法,要注意下细节。
# 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
"""
if not head or not head.next:
return head
fast, slow = head.next, head#
while fast and fast.next:
fast = fast.next.next
slow = slow.next
head1, slow.next = slow.next, None
left = self.sortList(head)
right = self.sortList(head1)
return self.merge(left, right)
def merge(self, left, right):
res = tem = ListNode()
while left and right:
if left.val < right.val:
tem.next = left
left = left.next
else:
tem.next = right
right = right.next
tem = tem.next
tem.next = left if left else right
return res.next
对于sortList函数,我第一次写的时候写成下面这样了,这样没法处理只有2个节点的链表。
#不能这样写,因为这样写不能处理只有2个节点的链表,当链表只有2个节点时就陷入了死循环
if not head or not head.next:
return head
fast, slow = head, head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
head1, slow.next = slow, None
left = self.sortList(head)
right = self.sortList(head1)
return self.merge(left, right)