【链表】Add Two Numbers

题目:

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

思路:

从左到右相加,记录进位值。

注意:两个链表不同长度,及链表相加后也要检验进位是否为0。

/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*/
/*** @param {ListNode} l1* @param {ListNode} l2* @return {ListNode}*/
var addTwoNumbers = function(l1, l2) {var carrybit=0,tempHead=new ListNode(0);var p=tempHead;while(l1&&l2){l1.val+=l2.val+carrybit;carrybit=l1.val/10;l1.val=l1.val%10;p.next=l1;p=p.next;l1=l1.next;l2=l2.next;}var lp=(l1==null?l2:l1);while(lp){if(carrybit==0){p.next=lp;break;}else{lp.val+=carrybit;carrybit=lp.val/10;lp.val=lp.val%10;p.next=lp;p=p.next;}lp=lp.next;}if(carrybit!=0){p.next=new ListNode(carrybit);}return tempHead.next;
};

 

如果链表存储整数时,高位在前,该如何处理。

1、最简单的想法是,可以先把链表反转,然后调用上面的算法,最后把结果反转。

2、可不可以从高位向低位方向处理呢?我们知道进位是从低位传向高位的,如果从高位向低位方向计算,当计算到某一位需要进位时,有没有办法知道该进位传递到前面的哪一位呢?从以下几个例子来看:

image

从最高位到最低位我们依次记为第 1,2…,7位。图中红色标记的位置是:下一次需要进位时,进位的1放置的位子

第1位相加,结果为12,需要进位,这个进位放到第0位;同时标记第1位为下一次的进位标志

第2位相加,结果为3,不需要进位;标记第2位为下一次进位标志

第3位相加,结果为3,不需要进位;标记第3位为下一次进位标志

第4位相加,结果为9,不需要进位;此时进位标志不需要移动,因为9加上一个进位后还要继续向前进位

第5位相加,结果为9,不需要进位;此时进位标志不需要移动,因为9加上一个进位后还要继续向前进位

第6位相加,结果为14,需要进位,这个进位放到前面标记的第3位上,同时把第4位和第5位置0,标记第6位为下一次进位标志

第7位同上

 

所以综上所述,从高位往低位计算加法时,规则是:

一、如果当前位没有进位:(1)如果当前位的和小于9,则把改位设置成下一次进位标志(2)如果和等于9,进位标志不变

二、如果当前位有进位:把进位的1加到前面标志的位子上,同时把标志位和当前位之间的位全部置0(因为他们之间的位肯定全部都是9),把当前位设置成进位标志

 

上面我们举例的两个加数长度一致,如果长度不相同,则要先处理较长的整数的前面多出的部分。

 

我们把这一题leetcode的输入反转,测试代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {l1 = reverseList(l1);l2 = reverseList(l2);int n1 = lenList(l1), n2 = lenList(l2);if(n1 < n2)//l1 指向较长的链表
        {swap(n1,n2);swap(l1,l2);}//carryLoc是下一次出现进位时,进位的1将要放置的位子,pre指向当前结果链表的最后一个节点//p1,p2分别是当前处理的l1,l2节点//由于加数的最高位有可能进位,所以添加一个新的节点newHeadListNode *newHead = new ListNode(0), *carryLoc = newHead, *pre = newHead, *p1 = l1;for(int i = 0; i < n1-n2; i++)//处理l1高位长出的部分
        {if(p1->val < 9)carryLoc = p1;pre->next = p1;pre = p1;p1 = p1->next;}ListNode* p2 = l2;while(p1 != NULL){pre->next = p1;pre = p1;p1->val += p2->val;if(p1->val > 9){carryLoc->val += 1;for(carryLoc = carryLoc->next; carryLoc != p1; carryLoc = carryLoc->next)//carryLoc到p1之间的节点全部置0carryLoc->val = 0;p1->val -= 10;}if(p1->val < 9)carryLoc = p1;p1 = p1->next;p2 = p2->next;}if(newHead->val != 0)return reverseList(newHead);else return reverseList(newHead->next);}//反转链表ListNode *reverseList(ListNode *l1){ListNode *p = l1->next, *pre = l1;l1->next = NULL;while(p){ListNode *tmp = p->next;p->next = pre;pre = p;p = tmp;}return pre;}//求链表长度int lenList(ListNode *head){int res = 0;while(head){res++;head = head->next;}return res;}
};

 

后面转载自:http://www.cnblogs.com/TenosDoIt/p/3735362.html

转载于:https://www.cnblogs.com/shytong/p/5146886.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ecs服务器数据迁移_如何非常方便地从Windows文件服务器把数据完整地迁移到ONTAP Select...

这是一个续篇&#xff0c;如果你依然爱你的Windows文件服务器或者使用Windows文件服务没有任何问题的话&#xff0c;请忽略我。续自&#xff1a;从Windows文件服务器&#xff0c;到ONTAP Select软件定义存储感谢联想凌拓合作伙伴新锐英诚的帮助&#xff0c;我们成功地做到了从海…

oracle触发和存储过程,Oracle存储过程与触发器

Oracle存储过程与触发器存储过程存储过程最直接的理解&#xff1a;就是保存了批量的sql(select,insert,if for)&#xff0c;以后可以通过一个名字把这些批量的sql执行&#xff0c;使用存储过程在大批量数据查询或计算时会带来高性能&#xff0c;存储过程编写和调试比较复杂&…

swift int转string_Swift集合类型协议浅析(下)

关注【搜狐技术产品】公众号&#xff0c;第一时间获取技术干货导读本篇是Swift集合类型协议浅析系列文章的下篇&#xff0c;在这篇文章中&#xff0c;我们将继续围绕集合类型协议展开讨论&#xff0c;侧重点更多地关注于String相关的周边协议。StringProtocol代表一个字符串&am…

oracle视图执行脚本,Sh脚本中查询Oracle v$视图时需要在$号前加转义符“\”

DBA经常会部署一些sh脚本登陆Oracle数据库查询v$动态视图得到一些东西来实际管理自动化的目的&#xff0c;但在sh脚本中写ORACLE SQL语句时&#xff0c;如果语句查询v$视图&#xff0c;直接写v$XXXX是不能成功的&#xff0c;shell会将$当成一个参数来处理。以下面一段简单的sh脚…

微信小程序页面跳转与返回并回传数据

2019独角兽企业重金招聘Python工程师标准>>> A页面&#xff1a; .wxml文件 <view class"flex-wrp"><text style"width: 32%;">选择城市</text><input style"width: 68%;" type"text" bindtap"ci…

地址栏 输入 参数 刷新参数丢失_小米11 Pro屏幕参数曝光:2K屏幕+120Hz刷新率

本周一&#xff0c;高通已经宣布将于12月初举行的骁龙技术峰会上正式发布新一代旗舰处理器——骁龙875。根据此前的曝光消息&#xff0c;小米11系列将首发搭载这颗芯片&#xff0c;网上也已经开始对这款新机进行曝光。日前&#xff0c;海外知名论坛XDA在MIUI 12的代码中发现了一…

Cypress EZ-USB FX3 DMA模式下的串口通讯

由于公司设备升级后出了问题&#xff0c;需要对USB驱动进行修改&#xff0c;原本使用的是寄存器模式进行UART传输&#xff0c;但是由于FX3寄存器模式会出现长时间延时等待的问题&#xff0c;不得不对其传输模式进行修改。虽然赛普拉斯的EZ-USB FX3系列芯片功能强大&#xff0c;…

springboot md5加密_实在!基于Springboot和WebScoket,写了一个在线聊天小程序

基于Springboot和WebScoket写的一个在线聊天小程序(好几天没有写东西了&#xff0c;也没有去练手了&#xff0c;就看了看这个。。。)项目说明此项目为一个聊天的小demo&#xff0c;采用springbootwebsocketvue开发。其中有一个接口为添加好友接口&#xff0c;添加好友会判断是否…

suse 启动oracle11g,SuSe10下Oracle11g文件系统模式安装及配置、网络配置与连接

SuSe10下Oracle11g文件系统模式安装及配置、网络配置与连接概述本课程主要讲解oracle数据库软件的安装及配置&#xff0c;以及数据库的创建过程和网络配置与连接等&#xff1b;同时讲解一些数据库安装过程中的常见问题解决办法。注意&#xff1a;本文当中引用的package_name均为…

Python pyenv

一、简介 一般在操作系统中我们会安装多个Python版本&#xff0c;所以在进行Python版本切换时会比较麻烦&#xff0c;pyenv就提供了一种简单的方式&#xff0c;能简易地在多个Python版本中进行切换的工具&#xff0c;它简单而优雅。pyenv有以下功能&#xff1a; 1&#xff09;进…

oracle 增加间隔分区,oracle分区表之间隔分区(oracle 11g) - 漫兮网

范围分区允许用户根据分区键列值的范围创建分区。下面是一个按范围分区表的示例&#xff1a;create table sales6(sales_id number,sales_dt date)partition by range (sales_dt)(partition p0701 values less than (to_date(2007-02-01,yyyy-mm-dd)),partition p0702 values l…

c++ try catch语句_再问你一遍,你真的了解try..catch(finally)吗???

定义首先来看下 MDN 的定义&#xff1a;The try...catch statement marks a block of statements to try and specifies a response should an exception be thrown.try...catch语句标记要执行的语句&#xff0c;并指定一个当有异常抛出时候的响应简短的一句的确描述了try...ca…

lamp架构,搭建一个网络平台

首先更改主机名和 hosts 安装软件包&#xff0c;设置启动服务 设置数据库密码 上传discuz论坛包 将discuz注册的用户名写在mariadb数据库中 解压discuz包 unzip discuz包 -d /var/www/html cd到upload下 cp -rf * /var/www/html 进入数据库 mysql -uroot -p create database…

MyEclipse中SVN的使用方法

1、 加载插件 svn-myeclipse插件site-1.10.2.zip&#xff0c;解压缩后&#xff0c;将文件夹下的所有文件拷贝到MyEclipse安装包下的MyEclipse 8.5\dropins文件夹下&#xff0c;然后重新打开myeclipse&#xff0c;会弹出一个报错窗口&#xff0c;不要管它&#xff0c;关闭后&…

oracle数据泵导出csv文件,数据泵expdp导出遇到ORA-01555和ORA-22924问题的分析和处理...

使用数据泵导出数据库数据时&#xff0c;发现如下错误提示&#xff1a;ORA-31693: Table data object "CAMS_CORE"."BP_EXCEPTION_LOG" failed to load/unload and is being skipped due to error:ORA-02354: error in exporting/importing dataORA-01555:…

Go程序开发---Go环境配置:CentOS6.5+Go1.8标准包安装

1.Go安装 1.1Go的三种安装方式 Go有多种安装方式&#xff0c;可以选择自己习惯的方式进行&#xff0c;这里介绍三种安装方式&#xff1a; 1&#xff09;Go源码安装 2&#xff09;Go标准包安装 3&#xff09;第三方工具安装 这里主要介绍下Go标准包在CentOS6.5系统中的安装方式 …

python矩阵乘法_鱼书——第一章 Python入门

one 第一章1.1 Python是什么Python是一个简单、易读、易记的编程语言&#xff0c;而且是开源的&#xff0c;可以免费地自由使用。Python可以用类似英语的语法编写程序&#xff0c;编译起来也不费力&#xff0c;因此我们可以很轻松地使用Python。特别是对首次接触编程的人士来说…

keepalived vip ping不通_【干货分享】OpenStack LVS负载均衡为什么不通?

背景介绍OpenStack环境Neutron 的安全组会向虚拟机默认添加 anti-spoof 的规则&#xff0c;将保证虚拟机只能发出&#xff0f;接收以本机Port为原地址或目的地址(IP、MAC)的流量&#xff0c;提高了云的安全性。但是LVS等需要绑定VIP的场景&#xff0c;默认流量是被拦截的。需要…

Docker安装ssh,supervisor等基础工具

2019独角兽企业重金招聘Python工程师标准>>> Docker安装ssh&#xff0c;supervisor等基础工具 需要提前下载好官方的ubuntu镜像&#xff0c;我这里使用的是ubuntu:14.04版本&#xff0c;这里安装了一些基础的工具ssh&#xff0c;curl&#xff0c;wget&#xff0c;vi…

nginx集群_windows环境下搭建简单Nginx+Tomcat集群

通俗点将&#xff0c;负载均衡就是因为访问流量太大&#xff0c;导致项目访问不流畅、甚至宕掉&#xff0c;所以通过一种分流的方式来缓解这种情况。一、 工具nginx-1.8.0apache-tomcat-6.0.33二、 目标实现高性能负载均衡的Tomcat集群&#xff1a;三、 步骤1、首先下载Nginx&a…