83. Leetcode 148. 排序链表 (排序)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。示例 1:输入:head = [4,2,1,3]
输出:[1,2,3,4]
示例 2:输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:输入:head = []
输出:[]
思路:
分割、排序环节:首先找到当前链表中点,并从中点将链表断开,以便在下次递归分割排序 时,链表片段拥有正确边界:
我们使用 fast,slow 快慢双指针法,奇数个节点找到中点,偶数个节点找到中心左边的节点。 找到中点 slow 后,执行 slow.next = None 将链表切断。
递归分割时,输入当前链表左端点 head 和中心节点 slow 的下一个节点 mid(因为链表是 从 slow 切断的)。
递归终止条件:当 head.next == None 时,说明只有一个节点了,直接返回此节点。
# 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: Optional[ListNode]) -> Optional[ListNode]:if head == None:return Noneif head.next == None:return head# 双指针寻找链表中点slow = headfast = headwhile fast.next != None and fast.next.next != None:slow = slow.nextfast = fast.next.next# 中点处切断,得到两个链表mid = slow.nextslow.next = None# 递归l1 = self.sortList(head)l2 = self.sortList(mid)return self.merge(l1, l2)def merge(self, l1, l2):dummpy = ListNode(0)cur = dummpywhile l1 != None or l2 != None:if l1 == None:cur.next = l2breakif l2 == None:cur.next = l1breakif l1.val >= l2.val:cur.next = ListNode(l2.val)cur = cur.nextl2 = l2.nextelse:cur.next = ListNode(l1.val)cur = cur.nextl1 = l1.nextreturn dummpy.next
83. Leetcode 148. 排序链表 (排序)相关推荐
- c语言单链表的字母排序,链表排序——选择排序法(纯C语言版)
/********************************* 链表的排序 *******************************************/ /* =========== ...
- 【LeetCode 148】链表的归并排序
上一篇文章用数组实现了二路归并排序,核心在于要对每次减半的元素进行实质性的改变,在数组中我们用临时数组记录每次merge的结果,在链表中用归并排序更加直接,因为我们操作的是结点的指针. 题目描述 难度 ...
- 【编程4】插入排序+快速排序+LeetCode.148(排序链表)
文章目录 一.排序链表 1.题目描述--LeetCode.148 2.分析 (1)一般的快排 (2)解题思路 3.实现 二.排序算法 三.插入排序 1.基本思想 (1)过程概述 (2)具体算法描述: ...
- 【LeetCode】【HOT】148. 排序链表(归并排序)
[LeetCode][HOT]148. 排序链表 文章目录 [LeetCode][HOT]148. 排序链表 package hot;import java.util.Arrays;class Lis ...
- 链表排序---迭代版本归并算法 + [leetcode]148. 排序链表
前言: 对于链表来说,排序首选应该是归并算法 维基百科上有归并算法的迭代版本和递归版本 基于数组实现的. https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B ...
- LeetCode Algorithm 148. 排序链表
148. 排序链表 Ideas 链表结构的经典题目. 不过我不想用经典方法做,哎,就是皮. 我把链表元素都拷贝到数组中,然后对数组排序,之后再把排完序之后的值赋回去. 骚的一批. Code Pytho ...
- LeetCode Algorithm 83. 删除排序链表中的重复元素
83. 删除排序链表中的重复元素 Ideas 这题挺简单的,直接一次遍历,如果当前遍历的元素val跟下一个元素的val相等,说明是重复元素,直接把当前item的next指向item->next- ...
- LeetCode 83. 删除排序链表中的重复元素(链表)
1. 题目 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2示例 2: 输入: 1->1->2-> ...
- leetcode No.83 删除排序链表中的重复元素
题目 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list 给定一个排序链表,删除所有重复的元素,使得每个元素只 ...
最新文章
- pythonselect a valied_python 11期 第五天
- 亚马逊专家揭秘:如何建立自动检测乳腺癌的深度学习模型
- 一个电脑白痴与黑客的对话
- HDU 4288 Coder [线段树]
- console linux 口 没输出_Console很飒,不止log
- springboot的yml自定义值的笔记
- 在 ASP.NET Core 中集成 Skywalking APM
- 数学特级教师:数学除了做题目,我还必须让他们看这些!
- windows安装java环境
- Struts2 继承ActionSupport类
- 电子沙盘 数字沙盘 开发教程
- android人脸识别的背景图_Android原生人脸识别Camera2+FaceDetector 快速实现人脸跟踪...
- XXL 定时任务实现
- 神经网络模型用于数学建模
- 数据科学与大数据技术和计算机科学与技术哪个好
- android手机图片质量,安卓手机对比iOS照片在微信分享时,竟大幅深压缩画质?...
- 量化金融论文:Astock
- 教你简单学会用Python画长草颜团子
- 人生若只如初见时[收藏]
- iso镜像文件怎么装系统图文操作