LeetCode题解2:Add two numbers

Add two numbers问题:给定2个用链表(Linked List)表示的10进制非负整数,求它们的和。

难度:容易

思路:遍历2个链表,按位求和。

陷阱:进位处理;两个链表长度不同

代码:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    # @param {ListNode} l1
    # @param {ListNode} l2
    # @return {ListNode}
    def addTwoNumbers(self, l1, l2):
        carry_over = 0
        dummy = end = ListNode(0)
        while l1 or l2 or carry_over:
            v1 = l1.val if l1 else 0
            v2 = l2.val if l2 else 0
            val = v1 + v2 + carry_over
            if val >= 10:
                carry_over = 1
                val = val - 10
            else:
                carry_over = 0
            end.next = ListNode(val)
            end = end.next
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
        return dummy.next

以上为常规解法,另有更Pythonic的另类解法,思路是:由于Python可以处理大整数加法,因此只需将两个链表转换成整数后相加,然后再将结果转换为链表即可。(实际运行效率略高于前述标准解法)代码如下:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    # @param {ListNode} l1
    # @param {ListNode} l2
    # @return {ListNode}
    def addTwoNumbers(self, l1, l2):
        def to_int(l):
            return l.val + 10 * to_int(l.next) if l else 0
        def to_list(val):
            l = ListNode(val % 10)
            if val > 9:
                l.next = to_list(val / 10)
            return l
        return to_list(to_int(l1) + to_int(l2))

问题扩展:对于任意多个加数的情况,可以用如下方式处理:

def addTwoNumbers(addends):
    dummy = end = ListNode(0)
    carry = 0
    while addends or carry:
        carry += sum(a.val for a in addends)
        addends = [a.next for a in addends if a.next]
        end.next = end = ListNode(carry % 10)
        carry /= 10
    return dummy.next
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目出处 来自于leetcode 题目描述 You are given two linked lists repr...
    yarving阅读 456评论 0 2
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 17,985评论 2 36
  • 从今天开始,写一下我在刷 LeetCode 时的心得体会,包括自己的思路和别人的优秀思路,欢迎各种监督啊! ...
    秋名山菜车手阅读 686评论 4 1
  • 这个题目内容是给定两个非空链表,每个链表表示一个非负整数,链表的每个节点存储整数的一位,且链表头为最高位,链表尾为...
    魏太恒阅读 352评论 0 1
  • 敲带脉,方法很简单,躺在床上,然后用手轻捶自己的左右腰部,100次以上就可以,不用刻意。一般是睡觉之前捶,第一次捶...
    0f0ea6e95189阅读 319评论 1 1