LeetCode2-链表两数和
题目描述

示例提示

经验教训
链表题的判空条件不是万能的,有时候示例会极其复杂,根本难以通过判空来区分不同情况。
/**
\* 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* AttachNode(ListNode* La, int temp){
if(1==temp){
ListNode* x = new ListNode;
x->val = 1;
La->next = x;
x->next = NULL;
}
return La;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {//新链表与l1共用
int temp=0;
ListNode *La=l1,*Lb=l2,*Lc=l1;
while(La&&Lb){//设置两个指针分别对l1和l2操作
La->val = La -> val + Lb -> val + temp;
if(La->val>=10){
temp = 1;
La->val-=10;
}
else{
temp = 0;
}
if(La->next&&Lb->next){
La = La -> next;
Lb = Lb -> next;
}
else{
break;
}
}
if(La->next==NULL&&Lb->next==NULL&&temp==1){
AttachNode(La,temp);
return l1;
}
if(1==temp){
if(Lb->next)La->next=Lb->next;
if(La->next){
La=La->next;
}
while(La){
//if(La->next==NULL&&Lb->next==NULL)break;
La->val += temp;
if(La->val>=10){
temp = 1;
La->val-=10;
}
else{
temp = 0;
}
if(La->next){
La = La->next;
}
else{
break;
}
}
}
// if(1==temp){
// ListNode* x = new ListNode;
// x->val = 1;
// La->next = x;
// x->next = NULL;
// }
AttachNode(La,temp);
return l1;
}
};
比如说
[5]
[5]
的情况与
[9,9,9,9]
[9,9,9]
的情况就无法区分(是指la->next为空且lb->next为空时,者要进行的操作是不一样的。)上述代码已经是想要两者兼顾了,但还是不行。
这里犯了一个致命的错误。觉得统计链表节点个数会很麻烦,所以直接针对各个情况判空来做,实际上示例给的会麻烦的多。仅凭结点判空的组合很难精确区分各个情况,所以不如节点个数来的块。
参考正解
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int size_1 = 0, size_2 = 0;
ListNode* temp = l1;
//统计l1长度
while(temp){
size_1++;
temp = temp->next;
}
//统计l2长度
temp = l2;
while(temp){
size_2++;
temp = temp->next;
}
//大于10的部分由remainder保留
int remainder = 0;
//longer指向最长的数组,shorter指向最短的;
ListNode* longer = (size_1 >= size_2) ? l1 : l2;
ListNode* shorter = (size_1 < size_2) ? l1 : l2;
//res指向最长的
//我们基于较长链进行操作
ListNode* res = longer;
//进行循环赋值
while(longer||shorter){
//长链先加上余数
longer->val += remainder;
//再加上短链
if(shorter){
longer->val += shorter->val;
}
//保留大于10的部分
if(longer->val > 9){
longer->val -= 10;
remainder = 1;
}
else{
remainder = 0;
}
//如果longer遍历到最后一位且大于10,末尾加上一个1的节点
//这里我是考虑到了,但是在我前面最终决定放弃的那个版本里产生了麻烦
if(longer->next == nullptr && remainder){
ListNode* ll = new ListNode(1);
longer->next = ll;
return res;
}
//继续走
longer = longer->next;
if(shorter){
shorter = shorter->next;
}
}
return res;
}
};
最大的问题就在于我在操作时没能就谁长谁短进行简化思考,觉得无端的遍历一遍链表很亏。所以只是随便挑选l1作为基准链表,然后将长的链表的后半部分链接过来,这样就增加了很多种处理情况给自己为难。
LeetCode2-链表两数和的更多相关文章
- python代码-leetcode2 链表-两数相加
示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 # Definitio ...
- leetcode 链表 两数相加
两数相加 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...
- 链表两数相加(add two numbers)
问题 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它 ...
- 两数相加(java版本)
(一).单链表实现 package com.lin.leetcode.addTwoNumbers; /** * Created by Yaooo on 2019/8/26. */ public cla ...
- [Swift]LeetCode2. 两数相加 | Add Two Numbers
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- 用单向链表实现两数倒序相加(java实现)
很久没做算法题了,准备重操旧业,于是刷了一波LeetCode,看到一个比较经典的链表算法题,分享出来. 题目 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将 ...
- LeetCode2.两数相加 JavaScript
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
- C语言链表之两数相加
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- Leetcode2.Add Two Numbers两数相加
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
- Leetcode(2)-两数相加(包含链表操作的注意事项)
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
随机推荐
- CVE-2020-2555漏洞复现&&流量分析
CVE-2020-2555漏洞复现&&流量分析 一.准备环境 windows7: weblogic 12.2.1.4.0 JDK版本为jdk-8u261 关于weblogic搭建可以看 ...
- Windows常用命令汇总以及基础知识
命令部分: dir dir指定要列出的驱动器.目录和/或文件 ,/?显示所有命令 例:dir /b /s /o:n /a:a 表示显示当前路径下的所有文件的绝对路径,包含子文件夹的内容 /b表示去除摘 ...
- 原来一条select语句在MySQL是这样执行的《死磕MySQL系列 一》
前言 看到蒋老师的第一篇文章后就收货颇丰,真是句句戳中痛点. 令我记忆最深的就是为什么知道了一个个技术点,却还是用不好 ?不管是蒋老师所说的Redis还是本系列要展开学习的MySQL. 这是一个值得思 ...
- deepin设置jdk全局变量
sudo vim /etc/bash.bashrc 在文件最后边添加 JAVA_HOME=jdk地址CLASSPATH=.:$JAVA_HOME/bin.tools.jarPATH=$JAVA_HOM ...
- Swagger2.X注解
常用到的注解有: 作用范围 API 使用位置 协议集描述 @Api 用于controller类上 协议描述 @ApiOperation 用在controller的方法上 非对象参数集 @ApiImpl ...
- 关于windows下 python3安装 cython的说明
针对python3.6希望在windows环境下安装cython,但是网上任何关于mingw的尝试都没有生效.所以只能下载 vs, 1.去官网https://visualstudio.microsof ...
- Hibernate之抓取策略
时间:2017-1-23 19:08 --区分延迟和立即检索1.立即检索 当执行某行代码时,会马上发出SQL语句进行查询. 例如:get()2.延迟检索 当执行某行代码时,不会马上发 ...
- 10分钟学会windows中iis搭建服务器集群实现负载均衡和nginx代理转发
前言 我们之前聊过 10分钟搭建服务器集群--Windows7系统中nginx与IIS服务器搭建集群实现负载均衡:https://www.cnblogs.com/xiongze520/p/103087 ...
- ES6——静态属性与静态方法
静态方法只能写在class内,constructor外.通过static关键字声明 静态属性只能写在class外,通过 类名.属性名 = 属性值 声明 //静态属性与静态方法(ES6明确规定,Clas ...
- 小程序跨页面传递data数据的三种方法
Q:小程序怎么把页面data里的数据传到另外的页面? 或者小程序怎么吧表单里的数据传到另外的页面?A:1.可以使用url传递数据. 例如在A页面中传递数据,需要注意的是,wx.switchTab中的u ...