leetcode中等148排序链表中等

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等148排序链表中等相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
思路:归并排序
在这里插入图片描述
需要两个函数,第一个负责合并两个链表(数组),第二个负责递归左右,递归的过程中合并

# 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:
        
        def merge_sort(head):
            if not head.next:
                return head
            #找到中点
            l=r=mid=mid_pre=head
            while r and r.next:
                mid_pre=mid
                mid=mid.next
                r=r.next.next
			#断开左右
            mid_pre.next=None
            #左右分别递归
            left=merge_sort(l)
            right=merge_sort(mid)
            return merge(left,right)

        #负责合并左右
        def merge(l1,l2):
            p=pre=ListNode(-1)
            while l1 and l2:
                if l1.val<l2.val:
                    p.next=l1
                    l1=l1.next
                else:
                    p.next=l2
                    l2=l2.next
                p=p.next
            p.next=l1 if l1 else l2
            return pre.next

		#主函数
        if not head:
            return None
        else:
            return merge_sort(head)

通常情况数组排序

def sort(lst, low, mid, high):
    i = low
    j = mid +1 # low到mid 代表了前面所有拍好序的一个组,mid 到 mid + 1 是乱序部分 mid+1 到最后又是另一个排好序的组
    lstm = []
    while i <= mid and j <= high:
        if lst[i] < lst[j]: 
            lstm.append(lst[i])
            i += 1
        else:
            lstm.append(lst[j])
            j += 1

    # 出现某一边先排完了,将剩下的有序数全部处理添加到新列表
    while i <= mid:
        lstm.append(lst[i])
        i += 1

    while j <= high:
        lstm.append(lst[j])
        j += high
    lst[low: high+1] = lstm   #最后将拍好序新列表的,赋值回传入的列表的索引段


def merge_sort(lst, low, high):
    if low < high:
        mid = (low + high) // 2
        merge_sort(lst, low, mid)
        merge_sort(lst, mid + 1, high)

        sort(lst, low, mid, high)  # 开始排序

list=[5,4,5,6,6,5,4,4,1,1,22,3,2]
n=len(list)
merge_sort(list,0,n-1)
print(list)

以上是关于leetcode中等148排序链表中等的主要内容,如果未能解决你的问题,请参考以下文章

leetcode中等82删除排序链表中的重复元素 II

LeetCode - 24 - 两两交换链表中等的节点 - Java

leetcode中等328奇偶链表

leetcode中等328奇偶链表

leetcode中等328奇偶链表

leetcode中等143重排链表