题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
思路和代码
这题本来也没啥好写的,但是相比于之前自己刷这题用的笨方法,这次用了新方法,并对新方法做了一定的代码简化,心里很有成就感,所以还是记录一下吧。
笨方法:
就是先得到两个数的和,然后用一个列表存放这个数每个位上的值,再根据这个列表创建一个新链表。
代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
def getNum(link):
num1 = 0
cur = link
radix = 1
while cur:
num1 += cur.val*radix
radix *= 10
cur = cur.next
return num1
sum_value = getNum(l1) + getNum(l2)
if sum_value == 0:
return ListNode(0)
res = []
while sum_value:
res.append(sum_value%10)
sum_value //= 10
dummy = ListNode(-1)
node = dummy
while res:
cur = ListNode(res.pop(0))
node.next = cur
node = node.next
return dummy.next
新方法:
对一位进行相加,有进位的话要加1,此外要考虑到两个链表可能不一样长,所以在第一个while循环里面,指向两个链表的指针都不为空,然后再有两个while循环,一个while循环处理第一个链表结束第二个链表还有值,另一个while循环处理第二个链表结束第一个链表还有值。这两个while循环只会执行一个,这让我想到了合并两个有序列表或者归并排序里面的merge函数。此外需要注意的是最后一位如果有进位,应该在加一个节点。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
cur_l1 = l1
cur_l2 = l2
dummy = ListNode(-1)
cur = dummy
getbit = 0
while cur_l1 and cur_l2:
num = cur_l1.val + cur_l2.val + getbit
getbit = 0
if num >= 10:
getbit = num // 10
num %= 10
node = ListNode(num)
cur.next = node
cur = cur.next
cur_l1 = cur_l1.next
cur_l2 = cur_l2.next
if cur_l1== None and cur_l2== None and getbit > 0:
node = ListNode(getbit)
cur.next = node
while cur_l1:
num = cur_l1.val + getbit
getbit = 0
if num >= 10:
getbit = num // 10
num %= 10
node = ListNode(num)
cur.next = node
cur = cur.next
cur_l1 = cur_l1.next
if cur_l1== None and getbit > 0:
node = ListNode(getbit)
cur.next = node
while cur_l2:
num = cur_l2.val + getbit
getbit = 0
if num >= 10:
getbit = num // 10
num %= 10
node = ListNode(num)
cur.next = node
cur = cur.next
cur_l2 = cur_l2.next
if cur_l2== None and getbit > 0:
node = ListNode(getbit)
cur.next = node
return dummy.next
最后,上述的代码其实有很多重复的,三种情况可以放在一个while循环里面写的。加几句判断条件就行。(真有意思)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
cur_l1 = l1
cur_l2 = l2
dummy = ListNode(-1)
cur = dummy
getbit = 0
while cur_l1 or cur_l2:
num1 = cur_l1.val if cur_l1 else 0
num2 = cur_l2.val if cur_l2 else 0
num = num1 + num2 + getbit
getbit = 0
if num >= 10:
getbit = num // 10
num %= 10
node = ListNode(num)
cur.next = node
cur = cur.next
if cur_l1:
cur_l1 = cur_l1.next
if cur_l2:
cur_l2 = cur_l2.next
if cur_l1== None and cur_l2== None and getbit > 0:
node = ListNode(getbit)
cur.next = node
return dummy.next