题目描述

示例提示

经验教训

链表题的判空条件不是万能的,有时候示例会极其复杂,根本难以通过判空来区分不同情况。

/**

 \* 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-链表两数和的更多相关文章

  1. python代码-leetcode2 链表-两数相加

    示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 # Definitio ...

  2. leetcode 链表 两数相加

     两数相加     给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...

  3. 链表两数相加(add two numbers)

    问题 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它 ...

  4. 两数相加(java版本)

    (一).单链表实现 package com.lin.leetcode.addTwoNumbers; /** * Created by Yaooo on 2019/8/26. */ public cla ...

  5. [Swift]LeetCode2. 两数相加 | Add Two Numbers

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  6. 用单向链表实现两数倒序相加(java实现)

    很久没做算法题了,准备重操旧业,于是刷了一波LeetCode,看到一个比较经典的链表算法题,分享出来. 题目 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将 ...

  7. LeetCode2.两数相加 JavaScript

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  8. C语言链表之两数相加

    题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  9. Leetcode2.Add Two Numbers两数相加

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  10. Leetcode(2)-两数相加(包含链表操作的注意事项)

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

随机推荐

  1. sqli-labs lesson 11-15

    从这一关开始我们开始进入到post注入的世界了,什么是post呢?就是数据从客户端提交到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证. ...

  2. 进程之间的通信(multiprocess.Queue)

    一.进程间通信 进程之间的数据是相互隔离的,例如 from multiprocessing import Process def task(): global n # 声明全局变量 n = 999 p ...

  3. WPF - 简单的UI框架 - 仪表盘

    源码链接:https://github.com/DuelWithSelf/WPFEffects 参考:https://www.cnblogs.com/duel/p/duel_clock.html 更新 ...

  4. c++中的一些会用到的函数

    1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() { 5 string s ...

  5. Linux centos 安装 Node.js

    官网下载地址 https://nodejs.org/zh-cn/download/ 1.下载二进制文件 (x64)   相当于  https://nodejs.org/dist/v10.16.3/no ...

  6. IP掩码的作用

    IP地址&IP掩码==网段,即,与上掩码后相同的IP属于同一网段.

  7. C#多线程开发-线程同步 02

    上一篇文章主要带领大家认识了线程,也了解到了线程的基本用法和状态,接下来就让我们一起学习下什么是线程同步. 线程中异常的处理 在线程中始终使用try/catch代码块是非常重要的,因为不可能在线程代码 ...

  8. Linux命令进阶篇之一

    利用file命令查看那文件的类型 cd /etc 这里面的文件 命令:file 语法:file [-bLvz] 文件 解释:-b:显示结果,但是不显示文件名称 -L:直接显示符号链接所指向的文件的类型 ...

  9. Linux下sed找出IP中第四位

    ip addr|sed -n '9p'|egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|sed -nr 's#^.*inet (.*) b ...

  10. 20210816 你相信引力吗,marshland,party?,半夜

    考场 第一眼都不可做 T1 长得就像单调栈/单调队列,推了推性质发现优弧.劣弧都合法的点对很好处理,其他情况只在一种情况合法,那么开两个单调队列分别统计距离 \(\le\frac2n,>\fra ...