【算法刷题】总结规律 算法题目第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
相关推荐
VertexGeek6 分钟前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
石小石Orz6 分钟前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
向上的车轮13 分钟前
软件世界中的超级bug有哪些?
bug
jiao_mrswang1 小时前
leetcode-18-四数之和
算法·leetcode·职场和发展
qystca1 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱1 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子1 小时前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab
是阿建吖!1 小时前
【优选算法】二分查找
c++·算法
王燕龙(大卫)1 小时前
leetcode 数组中第k个最大元素
算法·leetcode
不去幼儿园2 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习