day2——两数相加


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

 1 public ListNode myMethod(ListNode l1, ListNode l2){
 2         // 代表位数
 3         int e=10;
 4         //  连个单链表所做成的数字
 5         int ln1=0;
 6         int ln2=0;
 7         // 通过循环获得两个单链表所表示的整数
 8         while (true){
 9             ln1+= l1.val;
10             ln2+= l2.val;
11             if(l1.next==null&&l2.next==null)
12                 break;
13             l1.val=l1.next.val*e;
14             l2.val=l2.next.val*e;
15             e*=10;
16         }
17         // 获得最终链表所表示的整数
18         int sum=ln1+ln2;
19         // 代表位数
20         e=10;
21         // 设定最终链表
22         ListNode n = new ListNode(0);
23         //  设定临时值,方便为链表赋值
24         ListNode temp;
25         //为最终链表赋值
26         while(true){
27             temp=n;
28             temp.val=sum%10;
29             if(sum/e%10==0){
30                 break;
31             }
32             temp.next=new ListNode(sum/e%10);
33             temp=temp.next;
34         }
35         //返回最终链表
36         return n;
37     }
第一次尝试

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

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

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

posted @ 2018-11-17 19:36  绸缪  阅读(197)  评论(0)    收藏  举报