两数相加(C#数据结构和算法练习)
两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
算法思路和官方相同,但就语句而言或许可以进一步优化
关键代码:
ListNode result= new ListNode(); //当前节点,进行迭代
ListNode head = result; //头节点
int next = ; //若相加大于10进位则next==1
while (l1 != null || l2 != null)
{
int value1, value2;
if (l1 == null) //当l1或l2为空时,假设值为0
value1 = ;
else
value1 = l1.val;
if (l2 == null)
value2 = ;
else
value2 = l2.val;
int temp = value1 + value2;
result.val = temp + next;
if (result.val < ) //判断是否进位
{
next = ;
}
else
{
result.val = result.val - ;
next = ;
}
if (l1 != null) //l1和l2不为空时迭代
l1 = l1.next;
if (l2 != null)
l2 = l2.next;
if (l1 == null && l2 == null) //同时为空时结束,避免下方语句进行使得结果错误
break;
result.next = new ListNode();
result = result.next;
}
if (next == ) //出现进位但l1和l2下一数字都为0时上述循环无法进行,做特殊处理
{
result.next = new ListNode();
}
return head;
完整代码:
using System;
namespace numAdd
{
public class ListNode
{
public int val;
public ListNode next;
public ListNode(int x) { val = x; }
}
class Program
{
public static ListNode AddTwonumbers(ListNode l1, ListNode l2)
{
ListNode result= new ListNode(); //当前节点,进行迭代
ListNode head = result; //头节点
int next = ; //若相加大于10进位则next==1
while (l1 != null || l2 != null)
{
int value1, value2;
if (l1 == null) //当l1或l2为空时,假设值为0
value1 = ;
else
value1 = l1.val;
if (l2 == null)
value2 = ;
else
value2 = l2.val;
int temp = value1 + value2;
result.val = temp + next;
if (result.val < ) //判断是否进位
{
next = ;
}
else
{
result.val = result.val - ;
next = ;
}
if (l1 != null) //l1和l2不为空时迭代
l1 = l1.next;
if (l2 != null)
l2 = l2.next;
if (l1 == null && l2 == null) //同时为空时结束,避免下方语句进行使得结果错误
break;
result.next = new ListNode();
result = result.next;
}
if (next == ) //出现进位但l1和l2下一数字都为0时上述循环无法进行,做特殊处理
{
result.next = new ListNode();
}
return head;
}
static void Main(string[] args) //简单测试
{
ListNode l1 = new ListNode();
l1.next = new ListNode();
//l1.next.next = new ListNode(3); ListNode l2 = new ListNode();
//l1.next = new ListNode(6);
//l1.next.next = new ListNode(4); ListNode l3 = AddTwonumbers(l1, l2);
while (l3 != null)
{
Console.WriteLine(l3.val);
l3 = l3.next;
}
}
}
}
算法
从最低一位开始相加,大于9则进位处理,直至到最后处理完成
以下特别情况要特别注意:
| 测试用例 | 说明 |
|---|---|
| l1=[0,1],l2=[0,1,2]l2=[0,1,2] | 当一个列表比另一个列表长时 |
| l1=[],l2=[0,1]l2=[0,1] | 当一个列表为空时,即出现空列表 |
| l1=[9,9],l2=[1]l2=[1] | 求和运算最后可能出现额外的进位,这一点很容易被遗忘 |
两数相加(C#数据结构和算法练习)的更多相关文章
- LeetCode :2.两数相加 解题报告及算法优化思路
题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...
- Leetcode算法系列(链表)之两数相加
Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将 ...
- 【leetcode】 算法题2 两数相加
问题 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...
- day2——两数相加
// 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法题干//给定两个非空链表来表示两个非负整数.位数按照逆序方式存储, ...
- [CareerCup] 18.1 Add Two Numbers 两数相加
18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. 这道题让我 ...
- ✡ leetcode 167. Two Sum II - Input array is sorted 求两数相加等于一个数的位置 --------- java
Given an array of integers that is already sorted in ascending order, find two numbers such that the ...
- Leetcode(二)两数相加
两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...
- 两数之和,两数相加(leetcode)
我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...
- LeetCode(2):Add Two Numbers 两数相加
Medium! 题目描述: 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头 ...
随机推荐
- Leetcode——2. 两数相加
难度: 中等 题目 You are given two non-empty linked lists representing two non-negative integers. The digit ...
- Celery详解(1)
在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是 ...
- JMeter基础【第三篇】JMeter5.1元件作用域及执行顺序
执行顺序,大家可以实践验证,加深印象. 最后,给大家说一个万能且保险的方法:放到对应的取样器下面即可.
- js数组详解,js数组操作
转自 http://www.cnblogs.com/qiantuwuliang/archive/2011/01/08/1930499.html 1.数组的创建 var arrayObj = new A ...
- SVG学习(三)
_ 阅读目录 一:在SVG中使用样式 二:分组和引用对象 1. 理解 <g> 元素 2. 理解 <use> 元素 3. 理解 <defs> 元素 4. 理解< ...
- vue-cli3.0启动项目,在局域网内其他电脑通过自己ip访问
最近一直在使用vue-cli3.0做项目, package.json中配置后,自启动项目,也就没留意过小黑窗, "scripts": { "serve": &q ...
- java 多态(向上转型)
多态的定义与使用格式 多态的定义格式:就是父类的引用变量指向子类对象 父类类型 变量名 = new 子类类型(); 变量名.方法名(); 普通类多态定义的格式 父类 变量名 = new 子类(); ...
- Windbg Watch(监视)窗口的使用
在WinDbg中,可以使用“监视”窗口显示和更改全局和局部变量和寄存器信息. 您可以自定义此窗口以显示您正在跟踪的项..“监视”窗口可以显示所需的任何变量列表.这些变量可以包括来自任何函数的全局变量和 ...
- ESA2GJK1DH1K基础篇: 移植源码中SmartConfig程序到自己的项目
前言: 说明两个地方 1.点击按钮启动SmartConfig的地方 2.最终跳转的地方 说明 这节说明一下,如何把本人源码里面的SmartConfig程序移植到自己的工程 我要把所有的全部拿出来讲,让 ...
- CSRF 跨站
目录 CSRF 跨站请求伪造 解决跨站伪造问题: csrf 相关的装饰器: csrf.js文件: CSRF 跨站请求伪造 CSRF全称为Cross-site request forgery,也被称为: ...