用 PHP 在 力扣 刷算法 [两数相加]{一天一更}

题目:

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

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
作为小白,先要知道数据结构中有一种结构叫链表,啥子是链表呢,先用口水话说:
数据结构有线性结构和非线性结构,其中线性结构就是有零个或者多个数据元素的 有限序列,怎么个有序法呢?第一种:把数据元素放到连续的地址存储单元中;第二种:把带有标记数据元素放到存储单元中 这是就链表了,终于找到你,还好没忘记你…
链表又分,单向链、双向链表、循环链表。怎么解释这三个呢,随便来个图,希望我自己能看懂,哈哈…

循环链表就是这两种链表的尾部指向头形成环,就像一条蛇咬住自己的尾巴一样!!!2333

给自己复习了一下,开始正题的表演:

<?php
/*
 * 定义一个单链表
 * @param $val int
 * @param $next ptr 
 */
class ListNode {
 public $val = 0;
 public $next = null;
 function __construct($val) { $this->val = $val; }
}

class Solution {

    /**
     * @param ListNode $l1
     * @param ListNode $l2
     * @return ListNode
     */
    function addTwoNumbers($l1, $l2) {
        // 先初始化一个新节点
        $newList = new ListNode(0);
        // 赋值给用于计算后组成的链表的当前节点
        $com = $newList;
        // 定义一个变量储存 L1 L2对应链上的节点值相加时 需要进位的值,初始为 0 
        $result = 0;
        // 循环检查两个链表的是否结束
        while ($l1 != null || $l2 != null) {
            // 当链表不存在值时 为 0
            $l1val = $l1 != null ? $l1->val : 0;
            $l2val = $l2 != null ? $l2->val : 0;

            // 相加得到新的值,需要加 上一个相加进位的值 然后大于 10 需要进位,并且取出大于 10 的部分 
            // 取模得到大于 10 的部分
            $sum = $l1val + $l2val + $result;
            $newVal = $sum % 10;
            // 计算需要进位的值 取整除10 的部分
            $result = intval($sum / 10);

            // 新建一个节点
            $newNode = new ListNode($newVal);
            // 向链表中添加 指向新增的节点
            $com->next = $newNode;
            // 更新链表,让链表的当前节点是 刚刚新增的节点
            $com = $com->next;
            // 判断并更新 L1链表 和 L2 链表的操作节点
            if ($l1 != null) {
                $l1 = $l1->next;
            }
            if ($l2 != null) {
                $l2 = $l2->next;
            }
        }
        // 最后还有一个注意点,当进位不等于 0 的时候 还需要向链表中增加一个节点
        if ($result > 0) {
            $com->next = new ListNode($result);
        }
        // 返回
        return $newList->next;

    }
}

好了, 今天的就到这儿。下次继续记录

本作品采用《CC 协议》,转载必须注明作者和本文链接
join_jiang
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1
function addTwoNumbers($first, $second)
{
    $carry = 0;
    $str = '';

    // 循环次数以较长的数组为准
    $firstCount = count($first);
    $secondCount = count($second);
    $count = $firstCount > $secondCount ? $firstCount : $secondCount;

    for ($i = 0; $i < $count; $i++) {
        $firstValue = $first[0] ?? 0;
        $secondValue = $second[0] ?? 0;
        array_shift($first);
        array_shift($second);

        // 计算,额外处理最后一次的情况,在空字符串前追加数据
        $centerValue = $firstValue + $secondValue + $carry;
        $currentValue = $i === $count - 1 ? (int)$centerValue : $centerValue % 10;
        $carry = $centerValue / 10;
        $str = $currentValue . $str;
    }

    return $str;
}
3年前 评论
666666 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!