zoukankan      html  css  js  c++  java
  • leetcode-两数相加

    问题描述:

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

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

    您可以假设除了数字 0 之外,这两个数都不会以 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 {
         //编写方法算出l的值
            public int calSum(ListNode l){
                int head=1;
                int sum=0;
                int t=1;
                while(l1.head.val!=null){
                  sum +=(l1.head.val)*t;
                  t*=10;
                  head++;
            }
            return sum;
            }
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            //因为是逆序存储的,考虑可以将数据存储到栈中
            //先判断首位是否为0,如果为0,直接看另一个链表
            //如何取出链表中每个节点的值?
            
            //如果有一个链表的首位为0,则和链表即为另一个链表
            if(l1.head.val==0){
                return l2;
            }
            if(l2.head.val==0){
                return l1;
            }
            //两个链表均不为0
            //计算两个链表值的和
            int res=l1.calSum+l2.calSum;
            ListNode l3=new ListNode();
            //将结果输入到链表中
            int next=1;
            while(res/10!=0){
                int s=res/10;
                int value=res%s;
                l3.next.val=value;
                next++;
                res=s;
            }
         
        }
    }

    运行错误!!!!

    分析:

    (1)因为这里使用Java解决,所以把节点看作是一个类,ListNode这个类只是代表一个节点,而我误以为是代表一个链表!

    (2)在Java中是没有指针的,我这里习惯性地设置了head,表示指向当前节点的指针是严重的错误,所以 l.head本身就是错误的写法!!

    (3)我的思路是将两个链表的数值都求出来再相加,然后把和放进新链表中,但是当链表长度较大时,数据会溢出,这样很不安全!!!

    正确解答:

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode p = l1, q = l2, curr = dummyHead;
        int carry = 0;
        while (p != null || q != null) {
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;
            int sum = carry + x + y;
            carry = sum / 10;
            curr.next = new ListNode(sum % 10);
            curr = curr.next;
            if (p != null) p = p.next;
            if (q != null) q = q.next;
        }
        if (carry > 0) {
            curr.next = new ListNode(carry);
        }
        return dummyHead.next;
    }
    /*
    作者:LeetCode
    链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode/
    来源:力扣(LeetCode)
    */

    复杂度分析:

    时间复杂度:O(max(m,n)),假设 mm 和 nn 分别表示l1 和l2 的长度,上面的算法最多重复max(m,n) 次。

    空间复杂度:O(max(m,n)), 新列表的长度最多为 max(m,n)+1。

    分析:

    (1)该思路的方法是将对应的两个节点的值相加,如果超过10,就将carry赋值为1,每次计算两个节点值时,也要将carry的值加进去。

    (2)计算好当前节点时,就将下一个节点赋值给当前节点(如果下一个节点不为空的话),接着重复上面的步骤。

    (3)当然,因为要存储计算的和的值,所以会先创建一个值为0的新节点,然后将该节点的next节点赋值为(和%10),以此类推。

    注意事项:

    (1)要考虑两个链表长度不一样的情况。

    (2)要考虑有一个列表为空的情况。

    (3)要考虑节点全都计算完,最后还要进一的情况。

    总结经验:

    (1)使用三元运算判断节点值是否为空比用多个if判断要简单高效,要学习使用!

    (2)考虑问题一定要全面,要把各种特殊情况考虑到,比如这里的最后进一!

  • 相关阅读:
    【java读书笔记】——java的异常处理
    《C程序猿:从校园到职场》出版预告(4):从“散兵游勇”到“正规部队”
    GIS+=地理信息+行业+大数据——纽约公开11亿条出租车和Uber原始数据下载及分析
    Java第二次作业
    Qt5的插件机制(6)--开发Qt插件时几个重要的宏
    如何获得(读取)web.xml配置文件的參数
    JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记1
    虚幻4Matinee功能 基本概念及简单演示样例(Sequence编辑器)
    Loadrunner Analysis之Web Page Diagnostics
    Linux下Jenkins+git+gradle持续集成环境搭建
  • 原文地址:https://www.cnblogs.com/iceywu/p/12179665.html
Copyright © 2011-2022 走看看