版权声明:一篇成长日记文章,没什么转载价值。 https://blog.csdn.net/zhaoyanga14/article/details/83032650
题目:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
}
}
咋一看到这个题目的时候,说实话一脸懵圈。。看不懂,哪来的链表?但看到答题框中注释的时候才恍然大悟。。原来是这么个玩意。
理清思路:l1和l2参数的val属性分别是两个链表的个位数值,next属性则是代表十位数的ListNode对象。
首先需要创建一个新的链表,来存储计算结果。
还要有个循环,来不断的取链表的下一个值,直到两个链表都取空,循环结束。
在循环中要做的是,把两个链表相同位置值(val)的和 与 前一位求和的进位相加,放到新的链表中。这里有点需要注意,那就是两个求和的链表长度不一样的情况,所以这里还要做一个ListNode为空的判断,如果链表取空了,取不到val,就当作“0”计算。
一开始设想的代码如下:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
l1 = new ListNode(5);l2 = new ListNode(5);
int onesPlace = 0,onesDigit = 0,value = 0;
ListNode result = new ListNode(0),curr=result;
while(l1 != null && l2 != null){
value = ((l1!=null)?l1.val:0)+((l2!=null)?l2.val:0)+onesDigit;
onesPlace = value%10;
curr.next = new ListNode(onesPlace);
curr = curr.next;
onesDigit = value/10;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
if(onesDigit > 0){
curr.next = new ListNode(onesDigit);
}
return result.next;
}
}
但是结果不尽人意。。。
我发现我的方法中有多余的判断、声明变量和赋值,我把代码提炼了一下:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//用来存放进位
int value = 0;
//新建一个链表的首结点,用于构建结果链表,这里又将新建的result赋值给了curr,目的是用来循环构建这个链表
ListNode result = new ListNode(0),curr=result;
//判断两个求和链表是不是都取空了,没有的话就继续循环
while(l1 != null || l2 != null){
//判断当前节点是否为空,如果不为空,就将值和上个结点求和的进位相加,并将l1指向下个结点
if(l1 != null){
value += l1.val;
l1 = l1.next;
}
//同上
if(l2 != null){
value += l2.val;
l2 = l2.next;
}
//将求和后的个位数拼接在结果链表后面,即赋值给curr的next
curr.next = new ListNode(value%10);
//让curr指向curr的下一个结点
curr = curr.next;
//将求和后的进位,存到value中
value = value/10;
}
//判断最后一次求和是否有进位,有的话,将进位拼到结果链表后面
if(value > 0){
curr.next = new ListNode(value);
}
//因为结果链表的第一个结点的值是个多余的,所以从第二个结点开始,即首结点result的next
return result.next;
}
}
额。。。我已经精简了那么多了,已经认为够快了,为啥还是没超过一半的人??
好吧。。看看大神的代码,让我膜拜一下。结果发现功能的实现方式基本和我相同,而且我的更加精简一些。于是就把Top1的代码拿过来提交了一下。
56ms。。。纳尼?难道是当前服务器比较繁忙的原因吗?嘛。。心里好受多了。