给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解法一:(68ms/15MB)
- 取出两个链表的数值;
- 两个链表的值相加求和;
- 创建新链表。
# 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: ListNode, l2: ListNode) -> ListNode:
s1 = ''
while l1:
s1 = s1 + str(l1.val)
l1 = l1.next
s2 = ''
while l2:
s2 = s2 + str(l2.val)
l2 = l2.next
s3 = int(s1[::-1]) + int(s2[::-1])
s3 = [int(i) for i in str(s3)]
root = ListNode(s3.pop())
current = root
while s3 != []:
current.next = ListNode(s3.pop())
current = current.next
return root
解法二:(72ms/14.8MB)
考虑两种特殊情况:
1.长度不相等 123 + 45678
2.有进位的情形 11 + 99 = 110
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
# 创建一个结点值为 None 的头结点, dummy 和 p 指向头结点, dummy 用来最后返回, p 用来遍历
dummy = p = ListNode(None)
s = 0 # 初始化进位 s 为 0
while l1 or l2 or s:
# 如果 l1 或 l2 存在, 则取l1的值 + l2的值 + s(s初始为0, 如果下面有进位1, 下次加上)
s += (l1.val if l1 else 0) + (l2.val if l2 else 0)
p.next = ListNode(s % 10) # p.next 指向新链表, 用来创建一个新的链表
p = p.next # p 向后遍历
s //= 10 # 有进位情况则取模, eg. s = 18, 18 // 10 = 1
l1 = l1.next if l1 else None # 如果l1存在, 则向后遍历, 否则为 None
l2 = l2.next if l2 else None # 如果l2存在, 则向后遍历, 否则为 None
return dummy.next # 返回 dummy 的下一个节点, 因为 dummy 指向的是空的头结点, 下一个节点才是新建链表的后序节点
解法三:(56ms/15MB)
根据题意可知链表数字位数是从小到大的
- 因为两个数字相加会产生进位,所以使用i来保存进位。
- 则当前位的值为(l1.val + l2.val + i) % 10
- 则进位值为(l1.val + l2.val + i) / 10
- 建立新node,然后将进位传入下一层。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def dfs(l, r, i):
if not l and not r and not i: return None
s = (l.val if l else 0) + (r.val if r else 0) + i
node = ListNode(s % 10)
node.next = dfs(l.next if l else None, r.next if r else None, s // 10)
return node
return dfs(l1, l2, 0)
力扣 (LeetCode)链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvw73v/