【算法刷题】总结规律 算法题目第2讲 [234] 回文链表,因为深浅拷贝引出的bug

配合b站视频讲解食用更佳:https://www.bilibili.com/video/BV1vW4y1P7V7

核心提示:好几道题是处理有序数组的!

适合人群:考研/复试/面试

解决痛点:1. 刷了就忘 2.换一道相似的题就不会

学完后会输出:对每类题目的框架

python 复制代码
#
# @lc app=leetcode.cn id=234 lang=python3
#
# [234] 回文链表
#
from typing import Optional
import copy
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
# @lc code=start
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reserve(self,head:Optional[ListNode])->Optional[ListNode]:
        if (not head) or (not head.next):
            return head
        last = self.reserve(head.next)
        head.next.next = head
        head.next = None
        return last
    def isPalindrome(self, head: Optional[ListNode]) -> bool:
        head1 = copy.deepcopy(head)
        res = self.reserve(head1)
        while head and res:
            if head.val == res.val:
                head = head.next
                res = res.next
            else:
                return False
        return True
        
# @lc code=end
# 1,1,2,1
n0 = ListNode(1)
n1 = ListNode(1)
n2 = ListNode(2)
n3 = ListNode(1)
n0.next = n1
n1.next = n2
n2.next = n3
Solution().isPalindrome(n0)

判断链表是否是回文链表的问题,对应力扣234题:题目连接https://leetcode.cn/problems/palindrome-linked-list/description/

这道题我采用的思路是,翻转链表,然后和原链表挨个节点做比较。

但是写出了bug,

bug 在这里,是深浅拷贝的问题

res = self.reserve(head) 是不行的,因为head会被reserve改写,然后浅拷贝也是不行的,会报错。深拷贝是对的。

复制代码
  head1 = copy.deepcopy(head)
  res = self.reserve(head1)

对于简单的 object,例如不可变对象(数值,字符串,元组),用 shallow copy 和 deep copy 没区别

复杂的 object, 如 list 中套着 list 的情况,shallow copy 中的 子list,并未从原 object 真的「独立」出来。也就是说,如果你改变原 object 的子 list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对「复制」的理解不同。

一个很考察基本功,但是很赞的解法:

step1. 找中点

step2. 翻转中点后面的链表

step3. 比较left 和 right

python 复制代码
    def isPalindrome(self, head: Optional[ListNode]) -> bool:
        
        if not (head and head.next):
            return True
        # 找中点
        slow,fast = head,head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
        if fast:
            slow = slow.next
        left,right= head,self.reserve(slow)
        while left and right:
            if left.val != right.val:
                return False
            left = left.next
            right = right.next
        
        return True
相关推荐
Wect2 小时前
LeetCode 39. 组合总和:DFS回溯解法详解
前端·算法·typescript
Wect2 小时前
LeetCode 46. 全排列:深度解析+代码拆解
前端·算法·typescript
颜酱2 小时前
Dijkstra 算法:从 BFS 到带权最短路径
javascript·后端·算法
木心月转码ing5 小时前
Hot100-Day24-T128最长连续序列
算法
小肥柴5 小时前
A2UI:面向 Agent 的声明式 UI 协议(三):相关概念和技术架构
算法
学高数就犯困8 小时前
性能优化:LRU缓存(清晰易懂带图解)
算法
CoovallyAIHub10 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub11 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub11 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉