返回

LeetCode 2 号问题解决之道:两数相加的巧妙解答

见解分享

LeetCode 第 2 号问题概述

LeetCode 第 2 号问题:“两数相加”要求您将两个非空链表表示的非负整数相加,并返回结果链表。这两个链表中的数字是按照逆序存储的,每个节点只能存储一位数字。

巧妙解法:逐位相加法

解决此问题的一种巧妙方法是逐位相加法。我们可以从链表的尾部开始,将两个链表中的相应位数相加,并将结果存储在新的链表中。如果相加的结果大于或等于 10,则将进位值记为 1,并将其添加到下一个节点的相加结果中。

以下是以 Java 语言实现的逐位相加法代码示例:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode current = dummy;
        int carry = 0;

        while (l1 != null || l2 != null || carry != 0) {
            int sum = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + carry;
            carry = sum / 10;
            current.next = new ListNode(sum % 10);
            current = current.next;

            l1 = l1 == null ? null : l1.next;
            l2 = l2 == null ? null : l2.next;
        }

        return dummy.next;
    }
}

时间复杂度分析

逐位相加法的時間複雜度為 O(max(m, n)),其中 m 和 n 分別是兩個鏈表的長度。在最壞情況下,當兩個鏈表都非常長時,需要逐個比較和相加每個節點,因此時間複雜度為 O(m + n)。然而,在平均情況下,時間複雜度通常會更低,因為兩個鏈表通常不會非常長。

結論

LeetCode 第 2 號問題:“兩數相加”是編程面試中一個常見的問題。通過本文,我們介紹瞭解決此問題的巧妙解法——逐位相加法,並提供了 Java 語言的代碼實現。我們還分析瞭此解法的時間複雜度,以幫助您更好地理解算法的性能。希望本文能幫助您輕鬆應對此類問題,並在編程面試中取得優異的成績。