当前位置: 首页 > news >正文

力扣hot100_链表(3)_python版本

一、25. K 个一组翻转链表

1.1、206. 反转链表

在这里插入图片描述

  • py代码
class ListNode:def __init__(self, val=0, next= node):self.val = valself.next = next
class Solution:def reverseList(self, head):pre = Nonecur = headwhile cur:next = cur.nextcur.next = prepre = curcur = nextreturn pre

1.2、92. 反转链表 II

在这里插入图片描述

  • 思路:
    整体来看,1是反转前的第left个节点(p0.next),pre(4)是反转的后的头节点,cur是当前遍历到的节点下一个(5)。
class Solution:def reverseBetween(self, head, left, right):p0 = dummy = ListNode(next = head) # 这样一起实例化,p0和dummy永远都是指向同一位置for _ in range(left-1):p0 = p0.next  # 知道转换的前一个结点pre = Nonecur = p0.next     # 当前正在处理的节点for _ in range(right-left+1)nxt = cur.nextcur.nxt = prepre = curcur = nxtp0.next.next = curp0.next = prereturn dummy.next

在这里插入图片描述

  • 代码:
class Solution:def reverseKGroup(self, head, k):n = 0cur = headwhile cur:n += 1cur = cur.nextp0 = dummy = ListNode(next = head)pre = Nonecur = head# k个一组处理while n >= k:n -= kfor _ in range(k):nxt = cur.nextcur.next = prepre = curcur = nxtnxt = p0.nextnxt.next = curp0.next = prep0 = nxt

二、148. 排序链表

2.1、876. 链表的中间结点

在这里插入图片描述

  • 代码:这道题典型的快慢指针
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:t1 = t2 = headwhile t2 and t2.next:t1 = t1.nextt2 = t2.next.nextreturn t1

2.2、21. 合并两个有序链表

在这里插入图片描述

  • 代码:
class Solution:def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:dummy = ListNode()cur = dummywhile list1 and list2:if list1.val <= list2.val:cur.next = list1cur = cur.nextlist1 = list1.nextelse:cur.next = list2cur = cur.nextlist2 = list2.nextif list1:cur.next = list1else:cur.next = list2return dummy.next

在这里插入图片描述

  • 思路1:归并排序
    找到链表的中间节点,断开为前后两端,分别排序前后两端,排序后,再合并两个有序链表。
  • 代码1:
class Solution:# 876. 链表的中间结点(快慢指针)def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:slow = fast = headwhile fast and fast.next:pre = slow  # 记录 slow 的前一个节点slow = slow.nextfast = fast.next.nextpre.next = None  # 断开 slow 的前一个节点和 slow 的连接return slow# 21. 合并两个有序链表(双指针)def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:cur = dummy = ListNode()  # 用哨兵节点简化代码逻辑while list1 and list2:if list1.val < list2.val:cur.next = list1  # 把 list1 加到新链表中list1 = list1.nextelse:  # 注:相等的情况加哪个节点都是可以的cur.next = list2  # 把 list2 加到新链表中list2 = list2.nextcur = cur.nextcur.next = list1 if list1 else list2  # 拼接剩余链表return dummy.nextdef sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:# 如果链表为空或者只有一个节点,无需排序if head is None or head.next is None:return head# 找到中间节点 head2,并断开 head2 与其前一个节点的连接# 比如 head=[4,2,1,3],那么 middleNode 调用结束后 head=[4,2] head2=[1,3]head2 = self.middleNode(head)# 分治head = self.sortList(head)head2 = self.sortList(head2)# 合并return self.mergeTwoLists(head, head2)
http://www.xdnf.cn/news/101053.html

相关文章:

  • 在 UniApp 中获取当前页面地址
  • 【专题刷题】滑动窗口(四):
  • 华为仓颉编程语言基础概述 II
  • 【Unity笔记】Unity音效管理:ScriptableObject配置 + 音量控制 + 编辑器预览播放自动化实现
  • linux系统调用
  • 深入解析 Linux 系统中库的加载机制:从静态链接到动态运行时
  • 身份证实名认证:通往数字安全与便捷生活的钥匙
  • 出现 ORA-00904: “TENANT_ID“: 标识符无效 解决方法
  • openEuler Developer Day 2025举办!麒麟信安共筑坚实软件根基
  • MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典
  • Spring Security:企业级安全架构的设计哲学与工程实践
  • 如何使用极狐GitLab 的外部状态检查功能?
  • 说一下Redis的发布订阅模型和PipeLine
  • vue3 el-table 右击
  • 深度学习--ResNet残差神经网络解析
  • LLM基础-什么是嵌入(Embeddings)
  • 反激电源中的爬电距离
  • 监督学习(Supervised Learning)与无监督学习(Unsupervised Learning)​
  • 批量将多个 Excel 表格中的某张图片替换为新的图片
  • 基础算法合集-并查集
  • 《解锁vLLM:大语言模型推理的加速密码》
  • 赞奇AIknow知识图谱能力/案例介绍
  • 在KEIL里C51和MDK兼容以及添加ARM compiler5 version编译器
  • RK3568平台开发系列讲解(调试篇)debugfs API接口及案例
  • 亚马逊选品:手工与插件的差异剖析!
  • 飞帆控件:在编辑模式下额外加载的库
  • softirq
  • 网页设计规范:从布局到交互的全方位指南
  • axios 在请求拦截器中设置Content-Type无效问题
  • Generative AI for Krita - Krita 生成式 AI 插件