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;
}
posted @ 2020-04-15 01:15  鹿呦呦  阅读(264)  评论(0编辑  收藏  举报