用 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 协议》,转载必须注明作者和本文链接
推荐文章: