LeetCode-#2-两数相加(Add Two Numbers)

版权声明:一篇成长日记文章,没什么转载价值。 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。。。纳尼?难道是当前服务器比较繁忙的原因吗?嘛。。心里好受多了。

猜你喜欢

转载自blog.csdn.net/zhaoyanga14/article/details/83032650