leetcode(2)---两数相加

不时更新力扣题库,使用python实现,比较通俗易懂,其中注释是我自己的理解:

# 输入:l1 = [2,4,3], l2 = [5,6,4]
# 输出:[7,0,8]
# 解释:342 + 465 = 807.
# Definition for singly-linked list.


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


class Solution:

    def addTwoNumbers(self, l1, l2):
        # 如果有一个listnode没有填写,就返回剩下一个即可
        if l1 == None:
            return l2
        if l2 == None:
            return l1

        dummy = ListNode(0)
        p = dummy  # 设置初始的Listnode,主要是利用listnode的next操作
        carry = 0  # carry位主要保存进一操作
        # 若l1和l2都还不是None
        while l1 and l2:
            # 算当前位置的值,并且要加上之前的carry位
            p.next = ListNode((l1.val + l2.val + carry) % 10)
            carry = (l1.val + l2.val + carry) // 10  # 更新carry位
            l1 = l1.next  # 更新l1,去掉当前头部第一个元素
            l2 = l2.next
            p = p.next

            # 如果链表长度不相等,l1长,把l1后面的数字都到尾部
        if l1:
            while l1:
                p.next = ListNode((l1.val + carry) % 10)
                carry = (l1.val + carry) // 10  # 更新carry位
                l1 = l1.next  # 更新l1,去掉当前头部第一个元素
                p = p.next

        if l2:
            while l2:
                p.next = ListNode((l2.val + carry) % 10)
                carry = (l2.val + carry) // 10  # 更新carry位
                l2 = l2.next  # 更新l1,去掉当前头部第一个元素
                p = p.next

        # 如果加到最后一位还需要进位,那么就把最后一位加上去,carry最大只可能为1
        if carry == 1:
            p.next = ListNode(1)

        # 此时的p已经不是最开始的p,但是dummy指向了p的地址,用dummy去访问,next才是真正的值
        return dummy.next


if __name__ == '__main__':
    sol = Solution()

    l1: ListNode = ListNode(2, ListNode(2, ListNode(5)))
    l2: ListNode = ListNode(1, ListNode(3, ListNode(4)))
    res = sol.addTwoNumbers(l1, l2)

    print(res.val)

你可能感兴趣的:(python,git,leetcode,运维,java)