力扣hot100_链表(3)_python版本

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

1.1、206. 反转链表

  • py代码
python 复制代码
class ListNode:
	def __init__(self, val=0, next= node):
		self.val = val
		self.next = next
class Solution:
	def reverseList(self, head):
		pre = None
		cur = head
		while cur:
			next = cur.next
			cur.next = pre
			pre = cur
			cur = next
		return pre

1.2、92. 反转链表 II

  • 思路:
    整体来看,1是反转前的第left个节点(p0.next),pre(4)是反转的后的头节点,cur是当前遍历到的节点下一个(5)。
python 复制代码
class Solution:
	def reverseBetween(self, head, left, right):
		p0 = dummy = ListNode(next = head) # 这样一起实例化,p0和dummy永远都是指向同一位置
		for _ in range(left-1):
			p0 = p0.next  # 知道转换的前一个结点
		pre = None
		cur = p0.next     # 当前正在处理的节点
		for _ in range(right-left+1)
			nxt = cur.next
			cur.nxt = pre
			pre = cur
			cur = nxt
		p0.next.next = cur
		p0.next = pre
		return dummy.next
  • 代码:
python 复制代码
class Solution:
	def reverseKGroup(self, head, k):
		n = 0
		cur = head
		while cur:
			n += 1
			cur = cur.next
		p0 = dummy = ListNode(next = head)
		pre = None
		cur = head
		# k个一组处理
		while n >= k:
			n -= k
			for _ in range(k):
				nxt = cur.next
				cur.next = pre
				pre = cur
				cur = nxt
			nxt = p0.next
			nxt.next = cur
			p0.next = pre
			p0 = nxt

二、148. 排序链表

2.1、876. 链表的中间结点

  • 代码:这道题典型的快慢指针
python 复制代码
# 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 = head
        while t2 and t2.next:
            t1 = t1.next
            t2 = t2.next.next
        return t1

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

  • 代码:
python 复制代码
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        dummy = ListNode()
        cur = dummy
        while list1 and list2:
            if list1.val <= list2.val:
                cur.next = list1
                cur = cur.next
                list1 = list1.next
            else:
                cur.next = list2
                cur = cur.next
                list2 = list2.next
        if list1:
            cur.next = list1
        else:
            cur.next = list2
        return dummy.next
  • 思路1:归并排序
    找到链表的中间节点,断开为前后两端,分别排序前后两端,排序后,再合并两个有序链表。
  • 代码1:
python 复制代码
class Solution:
    # 876. 链表的中间结点(快慢指针)
    def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        slow = fast = head
        while fast and fast.next:
            pre = slow  # 记录 slow 的前一个节点
            slow = slow.next
            fast = fast.next.next
        pre.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.next
            else:  # 注:相等的情况加哪个节点都是可以的
                cur.next = list2  # 把 list2 加到新链表中
                list2 = list2.next
            cur = cur.next
        cur.next = list1 if list1 else list2  # 拼接剩余链表
        return dummy.next

    def 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)
相关推荐
生成论实验室13 分钟前
《源·觉·知·行·事·物:生成论视域下的统一认知语法》第五章 事:行在时空中的具体化
人工智能·算法·架构·知识图谱·创业创新
炸膛坦客23 分钟前
嵌入式 - 数据结构与算法:(1-4)数据结构 - 单链表的两个核心缺点(引入循环/双向链表)
c语言·数据结构·链表
Liangwei Lin23 分钟前
LeetCode 283. 移动零
算法
互联网时光机38 分钟前
我用 UniApp + 腾讯云 IAI 做了一个“明星脸比对“小程序,零后台延迟
经验分享·python·人脸识别
l1t39 分钟前
DeepSeek总结的Python 3.14.5 发布候选版本
开发语言·python
Cyber4K44 分钟前
【Python专项】进阶语法-日志分类与分析(2)
开发语言·前端·python
lbb 小魔仙1 小时前
Python + LangChain 环境搭建完全指南:从零构建本地 RAG 知识库(附 Ollama 本地模型集成)
开发语言·python·langchain
风落无尘1 小时前
Python 包发布全流程:从项目结构到 PyPI 上线,以及我踩过的那些坑
开发语言·python·pip
Lenyiin1 小时前
《LeetCode 顺序刷题》61 - 70
java·c++·python·算法·leetcode·lenyiin
岁岁的O泡奶1 小时前
NSSCTF_crypto_[LitCTF 2023]babyLCG
经验分享·python·算法·密码学·crypto·流密码