【链表】力扣 2816. 翻倍以链表形式表示的数字

信号编辑软件ZX/SignalEditing 阅读详情

一、题目

在这里插入图片描述

二、思路

  • 方法一
    根据题目 力扣 445. 两数相加 II 的思路。要进行链表的运算可以将链表首先进行 反转 (见 力扣 206. 反转链表),再来进行两节点之间的数值运算(见 力扣 2. 两数相加)。
  • 方法二
    本题与进行两数相加的差别在于:
    • 题目两数相加 是否产生进位的问题毫无规律可言,只取决于相加的两个链表对应的数值;
    • 而本题是将链表上的数字进行翻倍,获得的先验知识更多——可以看做两个相加的链表是一模一样的。那么,何时产生进位的规律也可以总结得到。
运算进位
1 × 20
2 × 20
3 × 20
4 × 20
5 × 21
6 × 21
7 × 21
8 × 21
9 × 21

由于链表存储数值采取的不是逆序的,与我们正常进行运算的顺序是相反的。但是根据本题中多出的先验知识,我们可以来避免进行 反转 的步骤。
根据上述表格可知,当节点的数值 大于 4 时才会有进位。因此,在不反转链表的情况下,只需要判断下一个节点的值与 4 的关系就可以确定当前节点是否要加进位 1。特别地,当头结点的数值大于 4 时,需要新创建一个节点来存储翻倍后进位产生的数值。

三、题解

  • 方法一
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode doubleIt(ListNode head) {
        if (head == null) return null;
        ListNode reversed = reverseList(head);
        ListNode doubled = doubleList(reversed, 0);
        return reverseList(doubled);
    }

    public ListNode reverseList(ListNode head) {
        ListNode pre = null, cur = head;
        while (cur != null) {
            ListNode tmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tmp;
        }
        return pre;
    }

    public ListNode doubleList(ListNode head, int carry) {
        if (head == null) {
            return carry != 0 ? new ListNode(carry) : null;
        }
        int value = (head.val * 2 + carry) % 10;
        carry = (head.val * 2 + carry) / 10;
        head.val = value;
        head.next = doubleList(head.next, carry);
        return head;
    }
}
  • 方法二
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode doubleIt(ListNode head) {
        if (head.val > 4) {
            head = new ListNode(0, head);
        }
        ListNode cur = head;
        while (cur != null) {
            cur.val = cur.val * 2 % 10;
            if (cur.next != null && cur.next.val > 4) {
                cur.val++;
            }
            cur = cur.next;
        }
        return head;
    }
}
智能座舱(七)——智能音频系统 本文剖析车载智能音频系统的核心技术,聚焦音响、功放、麦克风和广播收音机四大组件。音响系统通过多声道布局(如23扬声器阵列)结合动态声场校准算法,实现三维声场覆盖;功放系统采用高效D类技术,支持OTA音效调整和故障自愈;麦克风阵列运用波束成形技术实现精准拾音,并保障隐私安全;广播系统融合数字与网络技术提升音质。核心在于硬件标准化与算法差异化的协同,未来将朝集成化、AI个性化方向发展。 阅读详情

相关推荐

【数据分析生命周期全揭秘】从零开始打造你的数据科学项目 | 最全指南

在当今数据驱动的世界中,数据科学正在颠覆传统行业,成为企业决策和价值创造的重要引擎。然而,如何科学、系统地开展一个数据分析项目?这是很多人关心的核心问题。本篇文章基于经典数据分析课程内容,深入解读数据分析生命周期的每个阶段,让你快速掌握从“发现问题”到“落地应用”的完整流程。如果你正在学习或准备从事数据分析领域,这篇文章一定会对你大有帮助!数据分析生命周期的六大阶段数据分析生命周期的六个阶段相辅相成,每个阶段都至关重要:发现问题:明确需求,提出假设。数据准备:清洗、转换和可视化数据。

AI手套的博客 1739

leetcode_2816. 翻倍以链表形式表示的数字

我们可以想到 乘法运算中 就是从低位到高位进行计算 刚开始 我想先反转链表 然后在计算 然后在进行反转 得到一个新的结果 但是这样子耗费时间太多了。搜先看到这个题目 链表的节点那么多 已经远超longlong能够表示的范围 那么暴力解题 肯定是不可以的了。然后我还想到可以先把链表中的数先组成一个数 然后在进行计算 但是这个数远超longlong能表示的范围。此时 我们想到 链表的前一个节点的数与后一个节点的数有关 那么我们可以利用递归回溯来解决这一个问题。

m0_63056769的博客 500

保姆级教程:用MediaPipe和BlazePose在Python里实时追踪你的健身动作(附完整代码)

本文提供了一份详细的Python教程,教你如何使用MediaPipe和BlazePose实现实时健身动作追踪。从环境配置、模型选型到实时视频流处理架构设计,再到健身动作量化分析和可视化反馈系统优化,教程涵盖了完整的实现步骤和代码示例,帮助开发者快速构建高效的姿态特征点检测系统。

weixin_42531779的博客 153

【数据结构与算法 | 灵神题单 | 合并链表篇】力扣2, 21, 445, 2816

链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。新链表是通过拼接给定的两个链表的所有节点组成的。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。你可以假设除了数字 0 之外,这两个数字都不会以零开头。的链表,表示两个非负的整数。请你将两个数相加,并以相同形式返回一个表示和的链表。反转链表,让数字高位变成低位,然后低位开始相加。的方式存储的,并且每个节点只能存储。将两个升序链表合并为一个新的。看注释,题目也比较简单。

2301_80912559的博客 1045

【重启后nvidia-smi 命令出现错误】

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

qq_44769377的博客 5211

细胞膜电学特性的分数阶微积分建模

分数阶微积分在细胞膜电学特性建模中的应用主要体现在对细胞膜的电容行为和神经元放电活动的更精确描述上。

冰河世纪20的博客 620

LeetCode 分类刷题:2816. 翻倍以链表形式表示的数字

摘要:题目要求将代表非负整数的链表翻倍。作者解法通过反转链表、逐位计算并处理进位,最后再次反转得到结果,时间复杂度O(n),空间复杂度O(1)。灵神的优化方案更简洁:1)若头节点值大于4则先在前面补0;2)遍历时若下一节点大于4则提前+1进位。该方法同样保持O(n)时间和O(1)空间复杂度,但减少了操作次数。两种解法都高效完成了链表数字翻倍的任务,后者通过预判进位优化了计算过程。

flashlight_hi的博客 651

FPGA 学习笔记:解决FPGA程序固化重新上电程序不运行的问题

FPGA 学习笔记:解决FPGA程序固化重新上电程序不运行的问题

坚韧与专注 1万+

LeetCode 2816.翻倍以链表形式表示的数字

合并链表 练习题 : 翻倍以链表形式表示的数字

qq_57349657的博客 408

3.摄像头组件- CVP (ISP)

本文介绍 车载摄像头组件-ISP

2401_83458819的博客 1617

基于R-CNN深度学习的石头剪刀布手势识别系统:数据集、模型和UI界面的完整实现

本项目的目标是开发一个基于R-CNN深度学习模型的手势识别系统,能够识别石头、剪刀、布三种手势,并通过UI界面让用户能够进行交互。数据集准备与标注:收集包含石头剪刀布手势的图像,并对其进行标注。深度学习模型构建与训练:采用R-CNN模型进行手势的识别和定位。UI界面设计:设计一个简洁的界面,用户可以上传手势图像并进行识别。R-CNN(Region Convolutional Neural Networks)是一个典型的目标检测模型。生成候选区域。

YOLO 876

leetcode 2816.翻倍以链表形式表示的数字

【代码】leetcode 2816.翻倍以链表形式表示的数字。

m0_54244065的博客 422

2025年GESP12月认证C++一级真题解析

摘要 本文包含13道C++编程选择题,每题2分,涉及语法、运算符、循环、条件判断等知识点。题目考察了变量命名规则、运算符优先级、赋值语句、循环控制、格式化输出等内容。部分题目解析与标答存在差异,例如第4题逗号表达式输出应为5但标答为4,第6题赋值运算结果应为4 4但标答为3 4等。这些题目适合用于检验基础编程能力,但需注意部分标答可能存在争议,建议结合具体编译环境验证。最后一题考察"漂亮数"判断,要求填写数字某位能被3整除的条件表达式。

lan_in的博客 742

每日一题《leetcode--2816.翻倍以链表形式表示的数字》

处理完头结点后,就需要考虑其余结点。因为求的是链表中每个结点翻倍后的值,所以对于每个结点我们都需要考虑到进位的问题。因为每个数*2后再加上进位的数值也不可能超过20 ,所以最多进位1.这里我们直接模拟翻倍后链表的数字,首先我们得先考虑链表的头结点的值是否大于4(*2后是否需要进位)。

weixin_73359101的博客 273

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Day80 | 灵神 | 反转链表 翻倍以链表形式表示的数字

看做是两个head相加就直接转变为昨天写的两数相加II了。

m0_74795952的博客 380

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

[HOT 100] 2816. 翻倍以链表形式表示的数字

表示一个不含前导零的非负数整数。给你一个 非空 链表的头节点。将链表 翻倍 后,返回头节点。

人生需要动态规划 学习需要贪心算法 388

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

关于递归浅浅的一些理解

对于递归的理解

xxibgd1988的博客 425

反转链表学习笔记(二):K 个一组翻转链表,两数相加 II,翻倍以链表形式表示的数字

ps:笔记和代码按本人理解整理,重思路

学习记录 1256

2816. 翻倍以链表形式表示的数字

本文解决链表表示的数字翻倍问题。通过反转链表使低位在前,便于逐位处理进位;完成数值翻倍后再反转恢复原序。算法时间复杂度O(n),空间复杂度O(1)。关键步骤包括链表反转、数值计算和结果重组,确保进位正确处理。

人生需要动态规划 学习需要贪心算法 655

2024.6.7力扣刷题记录-链表篇学习记录

【反转链表】 https://www.bilibili.com/video/BV1sd4y1x7KN/?和(4)的解法道理是一样的,都是根据数值的范围确定只能进位一次。(4)是从上节点的角度,而(5)是从下节点的角度。当l1,l2遍历完但有进位时,会缺少节点,最好还是使用开新的储存空间的方法。又用到了栈,又用到了头插法,又新建节点,效率不是很高。先全部入栈,弹出一个运算一次头插一次。k个节点循环的做法,此时k=2。两个为一组直接进行反转连接。

lshx4658的博客 807

单向链表题库2(c++)

接着上一个作品的题库,没学单向链表的先看我这个作品(蓝色字体点进去),再看题库1巩固知识,然后再看这个题库。1.力扣——LCR 123. 图书整理 I(蓝色字体点进去看原题)代码题解/*** int val;* };*/public:vector<int> reverseBookList(ListNode* head) {//这一题就是反转链表,也就是逆序输出链表//定义一个顺序表用于返回逆序输出的值//一定要注意顺序表是从下标0开始的所以最后一个下标是长度减一。

ycs66的博客 789

leetcode358周赛

当有两个指针left和right,right指向的是两个数右边的那个数,当right增加的时候我们发现,前一个right的left指针指向的数放入数据结构中的那个,下标和当前right的距离也肯定大于x。其中求nums中的每一个数的数位最大值可以用map的方法,我自己做的时候是用的%10,感觉map这种方法很巧妙。核心思想:自己的话用的是笨办法,把所有值存在列表,然后翻倍后在创建一个新的链表,这里的方法用的是,先求个位,然后加进位的办法,如果后面的数大于等于5才会产生进位。

saonantabusao的博客 162

灵茶山06,6题

206. 反转链表 - 力扣(LeetCode)92. 反转链表 II - 力扣(LeetCode)25. K 个一组翻转链表 - 力扣(LeetCode)24. 两两交换链表中的节点 - 力扣(LeetCode)445. 两数相加 II - 力扣(LeetCode)2816. 翻倍以链表形式表示的数字 - 力扣(LeetCode)

2302_80742310的博客 171

通关Leetcode链表这一篇就够了

通关Leetcode链表

做点有意思的事情 483

力扣上适合考研408复习练手的题

主播自行整理,可留言私信关注主播力扣网站的题单,这里可能会忘记更新Ciallo~(∠・ω< )⌒★。

m0_73950692的博客 620

02-超经典Python算法刷题计划

周末03-28/29六/日周末04-04/05六/日周末04-11/12六/日。

weixin_60229630的博客 476
上一篇: 【反转链表】力扣 445. 两数相加 II
下一篇: 【二分查找】力扣 275. H 指数 II
JZihui
博客等级 码龄6年 170粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值