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 -& ...
随机推荐
- Django ORM记录的增删改查结合web端
模版语法分配变量 在views.py文件中定义一个视图函数show_data: def show_data(request): # 定义一个字典 并将它展示在前端HTML文件 user_dic = { ...
- DG:11.2.0.4 RAC在线duplicate恢复DG
1.环境介绍 测试环境, 在一个双节点的RAC上使用duplicate搭建DG,使用在线的方式搭建 主机 IP 操作系统 实例 db_name db_unique_name db_version 配置 ...
- python的基础---常用的正则表达式
"""# 一.re 模块 1.作用:根据规则去匹配字符串 2.表达式:匹配字符串的规则 3.常用方法 findall():[掌握]匹配所有的字符串,把匹配结果作为一个列表 ...
- NOIP 模拟 $28\; \rm 客星璀璨之夜$
题解 \(by\;zj\varphi\) 概率与期望,考虑 \(\rm dp\) 设 \(dp_{i,j}\) 为消除 \(i-j\) 这一段行星的期望,转移: 枚举 \(k\) 为当前状态下第一个撞 ...
- 第一次上传代码到gitee
初始化 git init 添加文件到本地仓库 git add . 提交文件到本地仓库 git remote add origin 仓库地址 拉去远程仓库代码 git pull origin maste ...
- RHEL 7 “There are no enabled repos” 的解决方法
RHEL 7 "There are no enabled repos" 的解决方法 [root@system1 Desktop]# yum install squidLoaded ...
- BST B树 B+树
二叉排序树/二叉搜索树 (BST) 定义 左子树节点值<根节点值<右子树节点值 默认不允许两个节点的关键值相同 进行中序遍历可以得到递增的有序序列 查找效率 取决与树的高度,最好O(log ...
- Heartbeat+HAProxy+MySQL半复制高可用架构
目录 一 基础环境 二 架构设计 三 安装MySQL 3.1 安装MySQL 3.2 初始化MySQL 四 配置MySQL半同步 4.1 加载插件 4.2 配置半同步复制 4.3 master创建账号 ...
- Python3-sqlalchemy-orm 联表查询-无外键关系
#-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...
- Python之requests模块-hook
requests提供了hook机制,让我们能够在请求得到响应之后去做一些自定义的操作,比如打印某些信息.修改响应内容等.具体用法见下面的例子: import requests # 钩子函数1 def ...