zoukankan      html  css  js  c++  java
  • LeetCode#2-Add Two Numbers-两数相加

    一、题目

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

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

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

    示例:

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

    二、题解

    特殊情况:
    1)一个链表比另一个链表长;
    2)一个链表为空,另一个链表不为空;
    3)求和运算可能出现进位。

    具体步骤:
    1)设置一个哑节点,并将当前节点初始化为这个哑节点;
    2)将进位 carry 初始化为 0;
    3)遍历列表 l1 和 l2 直至到达它们的尾端:
    ① 将 x 设为 l1 的节点。如果 x 已经到达 l1 的末尾,则将其值设置为 0;
    ② 将 y 设为 l2 的节点。如果 y 已经到达 l2 的末尾,则将其值设置为 0;
    ③ 和为 Sum = x + y + carry
    ④ 更新进位的值 carry = Sum / 10
    ⑤ 和对 10 取余,Sum = Sum % 10;创建这个结果的节点,并将其设置为当前结点的下一个节点,同时将当前节点前进到下一个节点;
    4)如果两个链表全部遍历完毕后,进位值 carry = 1,则在新链表最前方添加节点 1;
    5)返回哑节点的下一个节点。

    时间复杂度:O(n),空间复杂度:O(n)。

    function addTwoNumbers($l1, $l2) {
        $carry = 0;
        $dummyHead = new ListNode(0);
        $cur = $dummyHead;
        while ($l1 !== null || $l2 !== null) {
            echo $carry . "<br>";
            $x = $l1 == null ? 0 : $l1->val;
            $y = $l2 == null ? 0 : $l2->val;
            $sum = $carry + $x + $y;
            $carry = floor($sum / 10);
            $sum = $sum % 10;
            $cur->next = new ListNode($sum);
            $cur = $cur->next;
    
            if ($l1 !== null) {
                $l1 = $l1->next;
            }
            if ($l2 !== null) {
                $l2 = $l2->next;
            }
        }
        if($carry == 1) {
            $cur->next = new ListNode($carry);
        }
        return $dummyHead->next;
    }
    
  • 相关阅读:
    2018暑假辽宁省集训划水记
    gcd以及exgcd入门讲解
    tuple必须加上逗号
    stressapptest工具
    Linux Centos7设置UTF-8编码,防止中文乱码
    [python3.7]列表
    【转载】]基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程 介绍、安装准备、安装、config文件以及运行脚本介绍
    Linux Test Project(一)
    SPECCPU2006 Spec2006 使用说明
    测试用例使用!!!!!!!!!!!!!
  • 原文地址:https://www.cnblogs.com/sunshineliulu/p/12702661.html
Copyright © 2011-2022 走看看