zoukankan      html  css  js  c++  java
  • LeetCode 2.两数相加

    时间:2020/03/23

    一.题目描述

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

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

    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    二.算法

    题解:

    这是一个关于链表的问题,主要通过对两个链表的循换来实现每位相加,在循换的过程中要注意判断链表是否为空以及为空时要把链表的数值取值为0,在相加过程中要注意进位的判断,然后就是在循环结束后你要判断一下是否还有进位,如果有,则说明你漏掉了最高位的结点,这应该是这个题中最大的坑了,这里举个例子:5+5=10,如果你没有判断最后的进位,那你的结果一定是0,说明你漏掉了最高位的1.

    技巧:

    在初始化和链表时首先设置一个哑结点,哑结点的作用主要是为了避免初始化时的判断问题,使用哑结点后注意返回值为哑结点的下一个结点。

    代码:

    /**
     * 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) {
            ListNode l = new ListNode(0);
            ListNode p = l1, q = l2, k = l;
            int sum = 0;
            int crray = 0;
            while(p != null || q != null){
                int a = (p != null) ? p.val : 0;
                int b = (q != null) ? q.val : 0;
                sum = (a + b + crray) % 10;
                crray = (a + b + crray) / 10;
                k.next = new ListNode(sum);
                k = k.next;
                if(p != null) p = p.next;
                if(q != null) q = q.next;
            }
            if(crray > 0){
                k.next = new ListNode(crray);
            }
            return l.next;
        }
    }

    时间复杂度:O(m,n),其中m和n分别为l1和l2的长度。

  • 相关阅读:
    HTML <input> 标签的 maxlength 属性
    HTTP 方法:GET 对比 POST
    怎么在html页面和js里判断是否是IE浏览器
    一行神奇的javascript代码
    c# 数据库批量插入数据SqlBulkCopy 示例
    c# 多线程调用窗体上的控件 示例
    sqlserver查找使用了某个字段的所有存储过程
    SQL Server 数据库性能优化
    SQL语句的执行过程
    Sql Server- 性能优化辅助指标SET STATISTICS TIME ON和SET STATISTICS IO ON
  • 原文地址:https://www.cnblogs.com/machi12/p/12550909.html
Copyright © 2011-2022 走看看