1. 题目
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example 1:
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
Example 2:
Input: l1 = [0], l2 = [0]
Output: [0]
Example 3:
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]
2. 题目理解
按位加和,若有进位,向下一位加1。
3. 代码实现
1)思路一
将两个输入转为整数,将两个整数相加后再按格式输出。但这样的想法明显有一些冗余操作。
2)思路二
创建flag表示进位,按位相加并存储,若大于10则flag为1并存储个位。每次计算是均加入flag的计算,保证进位。操作完成后,进行下一位的计算。代码如下:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
head = ListNode(-1)
result = head
flag = 0
while l1 or l2 or flag:
addi = (l1.val if l1 else 0) + (l2.val if l2 else 0) + flag
flag = addi>9
head.next = ListNode(addi%10)
head = head.next
l1 = (l1.next if l1 else None)
l2 = (l2.next if l2 else None)
return result.next
3.改进
将结果直接存入l1,减少空间使用。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
head = ListNode(-1)
head.next = l1
result = head
flag = 0
while l2 or flag:
if not head.next and l2:
head.next = l2
l2 = None
elif not head.next and flag:
head.next = ListNode(1)
flag = 0
else:
flag, head.next.val = divmod((head.next.val if head.next else 0) + (l2.val if l2 else 0) + flag, 10)
head = head.next
l2 = (l2.next if l2 else None)
return result.next