// 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误,
  或有其他见解,往不吝赐教,感激不尽,拜谢。
领扣 第2题 今日算法
题干
//给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,
// 它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
// 你可以假设除了数字 0 之外,这两个数字都不会以零开头。
//
// 示例:
//
// 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
// 输出:7 -> 0 -> 8
// 原因:342 + 465 = 807
初次使用方法
/*
* 第一思路
* 第一步 求出左右两个链表所表达的值的和
* 第二部 将和赋予将要返回的链表
* 第一步 使用循环的方法,依次将链表中的元素扩大并相加
* 第二部 使用循环的方法, 通过对和取余的方式来获得各个位数的值,并放入到返回之中
* 不出意外 超时了
* */

 public ListNode myMethod(ListNode l1, ListNode l2){
// 代表位数
int e=10;
// 连个单链表所做成的数字
int ln1=0;
int ln2=0;
// 通过循环获得两个单链表所表示的整数
while (true){
ln1+= l1.val;
ln2+= l2.val;
if(l1.next==null&&l2.next==null)
break;
l1.val=l1.next.val*e;
l2.val=l2.next.val*e;
e*=10;
}
// 获得最终链表所表示的整数
int sum=ln1+ln2;
// 代表位数
e=10;
// 设定最终链表
ListNode n = new ListNode(0);
// 设定临时值,方便为链表赋值
ListNode temp;
//为最终链表赋值
while(true){
temp=n;
temp.val=sum%10;
if(sum/e%10==0){
break;
}
temp.next=new ListNode(sum/e%10);
temp=temp.next;
}
//返回最终链表
return n;
}

第一次尝试


/*
* 我想到了将上面的两个循环合并成一个,
* 经过了2个小时的各种完善,调优,
* 发现了我就是个弟弟
* = = 看了下 排在前面的优质代码
* 发现了这个写法 是我的思路的大成体
* 醍醐灌顶
* 牛逼
* */
     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//单列表 初始值为0 next地址为null
ListNode dummyHead = new ListNode(0);
// 临时链表 用于为不同的next复制
ListNode curr = dummyHead;
// 两数相加后的10位
int carry = 0;
//两数相加之和
int sum;
// 判断 l1,l2是否都没有下一元素
// 相当巧妙 避免了长度不同时 可能出现的空指针异常
// 很显然 在我之前试图调优代码时 我就犯了这个错误
while (l1 != null || l2 != null) {
// 不为空时则取值 否则避免影响取值为0
int x = (l1 != null) ? l1.val : 0;
int y = (l2 != null) ? l2.val : 0;
// 和 与 和是否超过了10
sum = carry + x + y;
carry = sum / 10;
// 创建新的链表元素 将总和的个位数传进去
curr.next = new ListNode(sum % 10);
// 将next 作为一下个元素的起点
curr = curr.next;
// 如果 l1,l2 已经没有下一个元素 则不取值
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
}
//上一循环结束时 最后一个元素的next并未赋值
// 如果 carry 为 0 则没有赋值的必要
if (carry > 0) {
curr.next = new ListNode(carry);
}
//此处注意 因为 我们是以dummyHead的下一个元素为起点
// 所以我们需要返回的是dummyHeather.next
return dummyHead.next;
}

优秀解


/*这个代码给我的感觉
著粉则太白,施朱则太赤---出自《登徒子好色赋》 (先秦·宋玉)
之前都未接触过链表 百度了下 又打开了数据结构的大门
思量了下 还是先以算法为主
以算法为媒 遇到了不懂的数据结构 不求烂熟于心 但求眼熟于瞳
程序员的世界太大了 走不完的 慢慢来 能走多远走多远 急不得*/

每个圣人都有过去,每个罪人都有未来
every saint has a past and every sinner has a future.
                                                        写于 2018.11.17

day2——两数相加的更多相关文章

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

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

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

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

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

  4. [Swift]LeetCode445. 两数相加 II | Add Two Numbers II

    You are given two non-empty linked lists representing two non-negative integers. The most significan ...

  5. leetcode 刷题(2)--- 两数相加

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

  6. Leetcode_两数相加_python

    小编从今天起要开始分享一些Leetcode代码,通过好好练习编程能力,争取以后找一份好工作. 题目:两数相加 # Definition for singly-linked list. # class ...

  7. Leetcode(二)两数相加

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

  8. 【LeetCode】两数相加

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

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

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

随机推荐

  1. less is more,so 只记 less

    less + 文件名 1.Enter键 :向下翻一行 2.空格键 :向下翻一屏 3.j键 :想下翻一行 4.k键 :向上翻一行 5.f键 :向下翻一屏 6.b键 : 向上翻一屏 7.d键 :向下翻半屏 ...

  2. datetime模块处理时间

    python常用的处理时间的库有:datetime,time,calendar.datetime库包括了date(储存日期:(年.月.日),time(储存时间:(小时.分.秒和微秒),timedelt ...

  3. CSAPP:第二章学习笔记:斗之气2段

    一.字长:虚拟地址通过一个字来编码,字长为32位,则可以标识2^32个地址空间,每个空间为一个字节,故为4G 二.字节序:当解释多个字节类型时,存在大小端字节序问题 0x1234567,在大小端表示法 ...

  4. Cocos Creator 获取当前URL取参数

    利用Javascript获取当前页的URL,这个问题起来好像很复杂,如果第一次去想这个问题,很多人估计又在琢磨到底又是哪个神一般的Javascript函数. 其实不是,Javascript获取当前页的 ...

  5. Qt QLabel 大小随内容自动变化 && 内容填充整个label空间

    图1:label的本身大小 图2:给label设置文字,不做任何别的设置 ui->label->setText(QObject::tr("current font is %1&q ...

  6. python数据类型之字典类型

    # 字典常用方法clear(), get(), pop(), update(),copy(),items(), popitem(),values(), fromkeys(), keys(),setde ...

  7. mysql服务启动不了 More help is available by typing NET HELPMSG 3534

    解决方法:参考 注意:如果安装MySQL的时候改了端口(如从3306改成3307),则my.ini配置文件的端口也需要相应的修改

  8. C# 链表去重 List 一维 二维 分别使用 Distinct() GroupBy() 方法

    分别使用List中Distinct(),GroupBy()实现链表的去重. 1.先上效果: 一维链表中分别有元素“aa”,"bb",'aa','aa',"cc" ...

  9. Android-Gradle(四)

    当你在开发一个app,通常你会有几个版本.大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要一个生产版本.这些版本通常有不同的设置,例如不同的URL地址.更可能的是你可能需要一个 ...

  10. /bin, /sbin & /usr/bin, /usr/sbin & /usr/local/bin, /usr/local/sbin & glibc

    操作系统为自身完成启动所需要的 /bin, /sbin 系统基本管理所需要的 /usr/bin, /usr/sbin 第三方的 /usr/local/bin, /usr/local/sbin 核心库 ...