147. 对链表进行插入排序

对链表进行插入排序。


插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

插入排序算法:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
 

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5


来源:力扣(LeetCode)

直接sort()

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def insertionSortList(self, head: ListNode) -> ListNode:
        res=head
        nodes=[]
        while res:
            nodes.append(res.val)
            res=res.next
        nodes.sort()
        i=0
        res=head
        while res:
            res.val=nodes[i]
            res=res.next
            i+=1
        return head

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def insertionSortList(self, head: ListNode) -> ListNode:
        if not head:return None
        nodes=[]
        node=head
        while node:
            nodes.append(node)
            node=node.next
        nodes=sorted(nodes,key=lambda x:x.val)
        for i in range(len(nodes)-1):
            nodes[i].next=nodes[i+1]
        nodes[len(nodes)-1].next=None
        return nodes[0]

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
import heapq
class Solution:
    def insertionSortList(self, head: ListNode) -> ListNode:
        if not head: return head

        heap = []
        heapq.heapify(heap)

        while head:
            heapq.heappush(heap, head.val)
            head = head.next

        root = ListNode(0)
        cur = root
        while heap:
            val = heapq.heappop(heap)
            cur.next = ListNode(val)
            cur = cur.next

        return root.next

归并排序

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def insertionSortList(self, head: ListNode) -> ListNode:
        
        def merge(p1, p2):
            p = helper = ListNode()
            while p1 and p2:
                if p1.val < p2.val:
                    p.next = p1
                    p1 = p1.next
                else:
                    p.next = p2
                    p2 = p2.next
                p = p.next
            if p1: p.next = p1
            if p2: p.next = p2
            return helper.next

        def merge_sort(left, right):
            if left is right: return left
            slow, fast = left, left.next
            while fast and fast.next:
                slow, fast = slow.next, fast.next.next
            mid, slow.next = slow.next, None
            p1 = merge_sort(left, slow)
            p2 = merge_sort(mid, right)
            return merge(p1, p2)
        
        return merge_sort(head, None)

插入排序

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def insertionSortList(self, head: ListNode) -> ListNode:
        dummy=ListNode(0)
        while head:
            p=dummy
            while p.next and p.next.val<head.val:
                p=p.next
            q=head
            head=head.next
            q.next=p.next
            p.next=q
        return dummy.next
原文地址:https://www.cnblogs.com/xxxsans/p/13782222.html