两数相加

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

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

您可以假设除了数字 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. xadmin引入django-import-export导入功能

    一.安装 由于xadmin自带的包里面已经包含了django-import-export 所以不用再pip install django-import-export了 但是xadmin管理后台只有导出 ...

  2. Linux权限设置基础

    chmod   linux系统中文件或目录有两个属性:访问权限和文件所有者,简称“权限”和“归属”. 访问权限包括:读取.写入.可执行. 归属包括:属主(拥有该文件的用户).属组(拥有该文件的用户组) ...

  3. selenium send_keys慢,卡,怎么办?这里有你想要的解决方案

    相信各位看官在用selenium时,会发现发送长字符时,一个字符一个字符在输入,特别在使用chrome时,更加明显. 如果你的网页是要大量编辑的怎么处理呢? 一.send_keys机制 既然问题出来了 ...

  4. LRU Algorithm Gym - 102394L (HASH)

    LRU Algorithm \[ Time Limit: 1000 ms\quad Memory Limit: 524288 kB \] 题意 给出 \(n\) 个数字和 \(m\) 次查询. 每次询 ...

  5. python yield实现协程(生产者-消费者)

    def customer(): r="" while True: n=yield r#,接收生产者的消息,并向消费者发送r print("customer receive ...

  6. 2-开发共享版APP(搭建指南)-修改包名

    https://www.cnblogs.com/yangfengwu/p/11273734.html https://www.cnblogs.com/yangfengwu/p/11273746.htm ...

  7. css规范思维导图(仅限于自己)

  8. python requests 上传excel数据流

    headers=self.headers #获取导入模版 file_home = self.import_template log.info(file_home) wb = load_workbook ...

  9. java信号量

    维基百科解释的信号量概念如下 信号量(英语:semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值.当线程完成一次对该semaphore对象的等待(wait)时,该 ...

  10. python总结五

    1.is和==的区别:官方文档解释:is表示的是对象标识符,而==表示的是相等equal,is的作用是用来检查对象的标识符是否一致,也就是两个对象在内存中的地址是否一样 而==是用来检查两个对象是否相 ...