【链表】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,一经查实,立即删除!

相关文章

我们为何要使用多线程,它有什么优点?

其实在平时的开发中&#xff0c;很多程序员都不会去写线程&#xff0c;为啥&#xff1f;因为麻烦&#xff0c;其次是用到的地方并不多&#xff0c;除非逼不得已&#xff0c;大家都不会去写&#xff0c;毕竟写一天代码&#xff0c;拿一天工资&#xff0c;是吧&#xff1f; 麻烦归…

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

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

yum第三方安装-软件包没签名及更新错误

yum安装时 后面加 --nogpgcheck 阿里云源文件&#xff1a;http://mirrors.aliyun.com/repo/Centos-7.repo epel repo源&#xff1a;http://mirrors.aliyun.com/repo/epel-7.repo yum update 错误提示 Error: initscripts conflicts with centos-release-7-4.1708.el7.centos.x8…

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

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

(hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)

题目&#xff1a;平方和与立方和Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 108212 Accepted Submission(s): 34915Problem Description给定一段连续的整数。求出他们中全部偶数的平方和以及全部奇数的立方…

企业高可用切换的说明

企业的应用场景&#xff0c;基本上都离不开高可用&#xff0c;不管是windows下自带的集群软件&#xff0c;或者是Linux下的heartbeat&#xff0c;keepalived等&#xff0c;AIX下的hacmp等。-----------------------------引用老男孩老师对高可用切换的说明--------------------…

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

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

50 jQuery绑定事件 阻止默认事件发生 内置动画 each data

主要内容 1 阻止后续事件继续执行 return false: 常用于表单提交 event.preventDefault : 阻止默认事件发生 <body> <form action""><input type"text" id"t1"><input type"submit" class"s1" id&qu…

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

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

Linux下实现视频读取(二)---camera參数设定

Camera的可设置项极多&#xff0c;V4L2 支持了不少。但Sam之前对这些设置的使用方法和涵义都是在看videodev2.h中边看边理解。感觉很生涩。直到写这篇blog时&#xff0c;才发现v4l2有专门的SPEC来说明&#xff1a; http://www.linuxtv.org/downloads/legacy/video4linux/API/V4…

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

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;…

php如何写一个能让外部访问的接口,如何写一个接口供外界访问

在工作的时候经常调用别人的接口&#xff0c;获取数据&#xff0c;然后就想知道这中间的原理是什么呢&#xff1f;今天上一个自己写的一个测试例子&#xff1a;首先是自己远程写好的一个接口&#xff1a;public function testming(){$arrarray(first > 1,hospitalname > …

win10远程桌面连接

有的情况下&#xff0c;Win10设置了允许远程桌面连接后&#xff0c;远程主机仍然不能桌面连接到目标主机上&#xff0c;这时可以在目标主机上尝试如下修改&#xff1a; 开始-->运行->gpedit.msc->计算机配置->Windows设置->安全设置->本地策略->安全选项-…

10494,没过,待解决,大数除法

10494,没过,待解决,大数除法 import java.io.*; import java.util.*;public class Main {public static void main(String[] args) throws FileNotFoundException{// Scanner scanner new Scanner(new File("d://1.txt"));Scanner scanner new Scanner(System.in);…

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;进…

python中add_Python add()函数是如何使用呢?

Python里经常会出现一些不太常见的函数&#xff0c;大家在遇到这类函数时候&#xff0c;是怎么做的呢&#xff1f;没有概念&#xff0c;直接过&#xff0c;还是会去查询下呢&#xff1f;相信大部分人都不会去查询&#xff0c;因为查询的内容太复杂了&#xff0c;所以&#xff0…