148. 排序链表

在 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)

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def sortList(self, head: ListNode) -> ListNode:
        a=[]
        p=head
        while p:
            a.append(p.val)
            p=p.next
        a.sort()
        i=0
        p=head
        while p:
            p.val=a[i]
            p=p.next
            i+=1
        return head

 

 

 

 归并排序

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def sortList(self, head: ListNode) -> ListNode:
        if not head or not head.next:return head
        mid = self.getMid(head)
        left = head
        right = mid.next
        mid.next=None
        l=self.sortList(left)
        r=self.sortList(right)
        return self.merge(l,r)
    
    def getMid(self,head):
        slow=head
        fast=head
        while fast.next and fast.next.next:
            slow=slow.next
            fast=fast.next.next
        return slow
    
    def merge(self,l,r):
        dummy=ListNode(None)
        cur=dummy
        while l and r:
            if l.val<=r.val:
                cur.next=l
                l=l.next
            else:
                cur.next=r
                r=r.next
            cur=cur.next
        cur.next=l or r
        return dummy.next

 

posted @ 2020-10-04 13:45  XXXSANS  阅读(83)  评论(0编辑  收藏  举报