【每日一题】445. 两数相加 II

news/2024/11/23 20:36:20/

【每日一题】445. 两数相加 II

  • 445. 两数相加 II
    • 题目描述
    • 解题思路

445. 两数相加 II

题目描述

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例1:
在这里插入图片描述

输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

示例2:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

示例3:

输入:l1 = [0], l2 = [0]
输出:[0]

提示:

链表的长度范围为 [1, 100]
0 <= node.val <= 9
输入数据保证链表代表的数字无前导 0

进阶:如果输入链表不能翻转该如何解决?

解题思路

思路:栈+竖式加法。分别使用栈st1、st2存储链表1、2元素,使用sum表示当前和,使用add表示进位,使用cur表示当前位。首先是两个指针均不为空时的处理,接着是两个指针两者之一为空时的处理,最后要注意残留add时的处理。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {//既然链表正序存储 那么就使用栈来存储 利用栈先进后出的性质stack<int> st1,st2;while(l1){st1.push(l1->val);l1=l1->next;}while(l2){st2.push(l2->val);l2=l2->next;}//剩下的本质上和2一样int sum;int cur;int add=0;ListNode* L=new ListNode();while(!st1.empty()&&!st2.empty()){sum=(st1.top()+st2.top()+add);cur=sum%10;add=sum/10;ListNode* temp=new ListNode(cur);temp->next=L->next;L->next=temp;st1.pop();st2.pop();}while(!st1.empty()){sum=(st1.top()+add);cur=sum%10;add=sum/10;ListNode* temp=new ListNode(cur);temp->next=L->next;L->next=temp;st1.pop();}while(!st2.empty()){sum=(st2.top()+add);cur=sum%10;add=sum/10;ListNode* temp=new ListNode(cur);temp->next=L->next;L->next=temp;st2.pop();}if(add){ListNode* temp=new ListNode(add);temp->next=L->next;L->next=temp;}return L->next;}
};

总结:两数相加II和两数相加的唯一区别在于,两数相加中的数是逆序存储,而两数相加II中的数是正序存储。两数相加的直观思维是竖式加法,而竖式加法正好满足逆序,现在既然是正序,那么就可以考虑如何将正序转换为逆序,此时正好利用栈结构的特性即可。

代码可能稍显冗余,但是思路较为清晰。


http://www.ppmy.cn/news/706108.html

相关文章

家政保洁维修上门预约系统开发;

家政保洁维修上门预约系统开发&#xff1b; 保洁&#xff0c;家电清洗等上门业务系统&#xff0c;支持派单接单&#xff0c;按区域&#xff0c;就近分配、套餐年卡等&#xff1b; 育婴月嫂系统 保姆筛选&#xff0c;简历主页&#xff0c;推荐跟进&#xff0c;在线合同&#xf…

viewsets.ViewSet 详细讲解

一、地址 官方地址&#xff1a; Viewsets - Django REST framework 相关文章&#xff1a; 二、ViewSets介绍 引入&#xff1a; from rest_framework import viewsets ViewSet 类只是一种类基础视图&#xff0c;它不提供任何方法处理程序&#xff08;如 .get() 或 .post…

python算法 -- 05 排序

冒泡排序 外层循环控制遍历的轮数&#xff0c;内层循环用于比较相邻元素并进行交换每一轮将剩下的元素里最大的放到最后 l [2, 45, 33, 68, 23, 45, 78, 99, 67, 10] n len(l)for i in range(n-1):for j in range(n-1-i):if l[j] > l[j1]:l[j], l[j1] l[j1], l[j]print…

单位社保缴纳明细表_职工社保缴费明细表

单位 个人 单位 20% 8% 7% XJK21331 姓名1 677*********** 10000 200 80 70 XJK21332 姓名2 678*********** 10000 200 80 70 XJK21333 姓名3 679*********** 10000 200 80 70 XJK21334 姓名4 680*********** 10000 200 80 70 XJK21335 姓名5 681*********** 10000 200 80 70 X…

办北京居住证,定制社保缴费记录,个人权益记录最近6个月的查询与打印,社保,北京市社会保险,北京市社会保险网上服务平台,北京市社会保险网上申报查询系统

20200519编辑 http://fuwu.rsj.beijing.gov.cn/csibiz/indinfo/index.jsp 必须要最近六个月的&#xff0c;网上是延迟2个月的&#xff0c;比如这个现在是5月份&#xff0c;就得要2020年03月和以前的&#xff08;就是要包含3月份的&#xff0c;以前打印的是包含到1月份不行&am…

武汉市个人社保缴费证明网上打印操作流程

本文首发于&#xff1a;https://www.hoscen.cn/blog/hao/articles/184053017752895488.html 作者&#xff1a;小郝不负流年 更多相关文章请访问 www.hoscen.cn ------ 前言&#xff1a; 由于本人多次涉及需要打印这个证明&#xff0c;而每次都会忘记入口&#xff0c;在网上…

将收支明细进行打印或者导出表格保存

生活中的每一笔支出、收入都是需要进行记录&#xff0c;这样才可以很好的帮助自己管理财富&#xff0c;那么拥有一款好用的记账软件也是非重要的&#xff0c;小编今天给大家分享晨曦记账本的两个功能将收支明细进行打印以及导出表格保存。 运行【晨曦记账本】&#xff0c;在软件…

如何查询社保的个人编号?

目录 一、电话查询二、网上查询三、微信查询1.进入微信&#xff0c;点击 “我” -> “服务” -> “城市服务”2.点击 “医保综合”3.点击 “广西医保服务”4.点击 “个人信息”5.点击 “账户信息”6. “账户信息” 底部的 “人员编号” 即为社保的个人编号 有多种方式可以…