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排序链表中等的主要内容,如果未能解决你的问题,请参考以下文章