两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 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#数据结构和算法练习)的更多相关文章

  1. LeetCode :2.两数相加 解题报告及算法优化思路

    题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...

  2. Leetcode算法系列(链表)之两数相加

    Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将 ...

  3. 【leetcode】 算法题2 两数相加

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

  4. day2——两数相加

    // 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法题干//给定两个非空链表来表示两个非负整数.位数按照逆序方式存储, ...

  5. [CareerCup] 18.1 Add Two Numbers 两数相加

    18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. 这道题让我 ...

  6. ✡ 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 ...

  7. Leetcode(二)两数相加

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

  8. 两数之和,两数相加(leetcode)

    我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...

  9. LeetCode(2):Add Two Numbers 两数相加

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

随机推荐

  1. hdu1801 01翻转 贪心

    题目描述: 对于给出的一个n*m的矩形,它由1和0构成,现在给你一个r*c的矩形空间可以选择,且可以选择无数次(被选中的范围内01翻转),要求问将这个01矩阵全部变成0的最少需要翻多少次,且如果无法实 ...

  2. hexo 搜索功能

    搜索功能真心好用,当文章多起来的时候,标签提供的作用已经很少了,只能简单索引,搜索却能精确查找,这里我用的依旧是最简单的本地站内搜索. 安装插件 npm install hexo-generator- ...

  3. Win7下安装openssl

    安装环境: 操作系统:window7(64位) C++编译器:VS2012 -------------------------------------------------------------- ...

  4. python 基础笔记-函数

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段·. 好处为: 一可以把程序中相对独立的功能模块抽取出来,减少重读代码的编写: 二是将来可以以重复的使用这些功能模块    定义一个函数 ...

  5. css display:inline

  6. opengl第一个工程

    #include <iostream> #include <glad/glad.h> #include <GLFW/glfw3.h> void framebuffe ...

  7. 数据结构——单链表(singly linked list)

    /* singlyLinkedList.c */ /* 单链表 */ /* 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. */ #include <stdio ...

  8. 直接插入排序与缩小增量插入排序(希尔排序ShellSort)

    直接插入排序 要理解shell排序,首先要把直接插入排序的基础打扎实. 学习资料:白话经典算法系列之二 直接插入排序的三种实现.直接插入排序 根据我的思路,直接插入排序设置3重循环. 循环1:对 i= ...

  9. C# 动态加载(转)

    原文链接地址:http://blog.csdn.net/lanruoshui/article/details/5090710 原理如下: 1.利用反射进行动态加载和调用. Assembly assem ...

  10. 使用Swagger2构建SpringMVC项目中的Restful API文档

    使用Swagger自动生成API文档,不仅增加了项目的可维护性,还提高了API的透明度更利于快速测试等工作,便于更快地发现和解决问题. 本篇文章只记录整合过程,关于Security Configura ...