leetcode11-面试题 02.05. 链表求和
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
思路一:
把链表转换成数组,对数组进行相加
代码一:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
# 第一步:获取两个数字的各个元素
num1 = []
num2 = []
while l1:
num1.append(l1.val)
l1 = l1.next
while l2:
num2.append(l2.val)
l2 = l2.next
# 正常求和后转换成str
res = str(int(''.join([str(i) for i in num1[::-1]])) + int(''.join([str(i) for i in num2[::-1]])))
return self.head_list(res)
def head_list(self, s):
head = ListNode(int(s[0])) # head初始化为s的首元素
for i in s[1:]:
node = ListNode(int(i)) # 新建链表节点
node.next = head # 把当前有val的head节点复制给node.next
head = node # 把node复制给head节点
return head
思路二:指针
- 设置s来判断是否需要进位,s=0不需要进位,s=1进位
- 利用temp指针来存放
# 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:
ans = ListNode(None)
node = ans
s = 0
while l1 or l2:
n1 = l1.val if l1 else 0
n2 = l2.val if l2 else 0
total = n1 + n2 + s
num = total//10
if num > 0:
temp = ListNode(total%10)
node.next = temp
node = temp
s = 1
else:
s = 0
temp = ListNode(total)
node.next = temp
node = temp
if l1:l1 = l1.next
if l2:l2 = l2.next
if num > 0 and not l1 and not l2:
node.next = ListNode(1)
return ans.next