题目描述
解法一:用栈(Python)
# 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:
s1, s2 = [], []
while l1:
s1.append(l1.val)
l1 = l1.next
while l2:
s2.append(l2.val)
l2 = l2.next
ans = None
carry = 0
while s1 or s2 or carry != 0:
a = 0 if not s1 else s1.pop()
b = 0 if not s2 else s2.pop()
cur = a + b + carry
carry = cur // 10
cur %= 10
curnode = ListNode(cur)
curnode.next = ans
ans =curnode
return ans
解法二:递归(Python)
基本思路:
- 先各自求出两个链表长度,视情交换链表,确保链表1总是不短于链表2
- 设计一个递归函数,包括当前4个参数,分别是当前处理的两个链表节点及剩余节点个数,且处理节点值在链表1上进行inplace更新:
– 如果当前链表1剩余节点数大于链表2节点,则仅对链表1继续递归
– 否则,即链表节点数相等,但链表1和链表2剩余节点数大于1个,同时进行递归
对两链表头节点返回的进位判断,如果非0,则生成新节点,连接链表1,返回;否则直接返回链表1头节点。
class Solution:
def addTwoNumbers(self, l1, l2):
def add(num1, num2, i, j):
if not i or not j:
return 0
if num1 > num2:
temp = i.val + add(num1 - 1, num2, i.next, j)
else:
temp = i.val + j.val + add(num1, num2, i.next, j.next)
i.val = temp % 10
return temp // 10
num1 = num2 = 0
cur = l2
while cur:
num2 += 1
cur = cur.next
cur = l1
while cur:
num1 += 1
cur = cur.next
if num2 > num1:
l1, l2 = l2, l1
num2, num1 = num1, num2
if add(num1,num2,l1, l2):
l2 = ListNode(1)
l2.next = l1
l1 = l2
return l1