当前位置: 面试刷题>> 链表求和Ⅱ (经典算法题500道)


题目描述补充

题目:链表求和Ⅱ

给定两个非空链表 l1l2,它们表示两个非负整数,其中每个节点包含一个数字,并按逆序存储数字(即,链表的第一个节点表示数字的最高位)。编写一个函数来计算这两个数相加的结果并以链表形式返回。结果链表也应当以逆序存储这些数字。

例如:

  • 输入:l1 = 1 -> 2 -> 3, l2 = 4 -> 5 -> 6
  • 输出:5 -> 7 -> 9,因为 321 + 456 = 777,而 777 的逆序是 5 -> 7 -> 9

注意:

  1. 输入的链表至少包含一个节点。
  2. 每个节点的值在 [0, 9] 范围内。
  3. 题目数据保证结果不会超出 int 类型的范围。

示例代码

PHP 示例

class ListNode {
    public $val;
    public $next;
    function __construct($val = 0, $next = null) {
        $this->val = $val;
        $this->next = $next;
    }
}

function addTwoNumbers($l1, $l2) {
    $dummy = new ListNode(0);
    $current = $dummy;
    $carry = 0;

    while ($l1 !== null || $l2 !== null || $carry > 0) {
        $x = ($l1 !== null) ? $l1->val : 0;
        $y = ($l2 !== null) ? $l2->val : 0;
        $sum = $x + $y + $carry;

        $carry = intdiv($sum, 10);
        $current->next = new ListNode($sum % 10);
        $current = $current->next;

        if ($l1 !== null) $l1 = $l1->next;
        if ($l2 !== null) $l2 = $l2->next;
    }

    return $dummy->next;
}

Python 示例

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def addTwoNumbers(l1, l2):
    dummy = ListNode(0)
    current = dummy
    carry = 0

    while l1 or l2 or carry:
        x = l1.val if l1 else 0
        y = l2.val if l2 else 0
        sum_ = carry + x + y
        carry = sum_ // 10
        current.next = ListNode(sum_ % 10)
        current = current.next
        if l1: l1 = l1.next
        if l2: l2 = l2.next

    return dummy.next

JavaScript 示例

function ListNode(val, next) {
    this.val = (val===undefined ? 0 : val)
    this.next = (next===undefined ? null : next)
}

function addTwoNumbers(l1, l2) {
    let dummy = new ListNode(0);
    let current = dummy;
    let carry = 0;

    while (l1 !== null || l2 !== null || carry > 0) {
        let x = (l1 !== null) ? l1.val : 0;
        let y = (l2 !== null) ? l2.val : 0;
        let sum = carry + x + y;

        carry = Math.floor(sum / 10);
        current.next = new ListNode(sum % 10);
        current = current.next;

        if (l1 !== null) l1 = l1.next;
        if (l2 !== null) l2 = l2.next;
    }

    return dummy.next;
}

码小课:在算法和数据结构的学习中,链表是一个非常重要的基础概念。以上代码示例展示了如何在链表上进行基本的操作和计算,希望这些示例能帮助你更好地理解链表以及如何在面试中应对类似的问题。码小课网站中有更多关于链表、算法和数据结构的详细讲解和练习题,欢迎大家前去学习交流。

推荐面试题