美文网首页
148. 排序链表(medium)

148. 排序链表(medium)

作者: genggejianyi | 来源:发表于2019-06-13 21:49 被阅读0次

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5

  • show the code:
# 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 or not head.next:
            return head
        pre,slow,quick = None,head,head
        while quick and quick.next:
            pre = slow
            slow = slow.next
            quick = quick.next.next
        pre.next = None
        return self.merge(*map(self.sortList,(head,slow)))
    def merge(self,l1,l2):
        if l1 and l2:
            if l1.val > l2.val:
                l1,l2 = l2,l1
            l1.next = self.merge(l1.next,l2)
        return l1 or l2
  • 此题由于题目条件限制,采用归并排序。分为两个步骤:第一步将链表从中点截成两段,这一步可以使用快慢指针来解决。第二步递归的融合两个有序链表,这个在之前的题目中有涉及到:合并两个有序链表
  • 其实此题也就是归并排序的思想,不断的分为两半,最后分到一个数的时候,链表一定是有序的,再递归回去,合并两个有序链表即可。

相关文章

网友评论

      本文标题:148. 排序链表(medium)

      本文链接:https://www.haomeiwen.com/subject/iigefctx.html