2.两数相加
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
思路
其实就是模拟加法,而且为了节省空间,将结果放在list1上。一直将两条链相加,如果有进位处理进位,直到一条链为空,然后将那条非空的链续在断开处。
算法
1.当两条链非空,计算l1+l2将结果放在l1上,如果和大于9,此时l1.next为空,则给l1新建一个节点,如果不为空,l1.next.val+1.
2.当一条链为空,如果是l1为空转3,如果是l2为空转4
3.将l1结尾与l2相连
4.处理步骤1跳出位置的l1_now,直到当前位置小于10不用进位。
5.输出l1
# 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:
new_head = ListNode()
new_head.next = l1
l1_end = l1
while l1 and l2:
l1.val += l2.val
if l1.val>=10:
d = l1.val//10
l1.val %= 10
if l1.next:
l1.next.val +=d
else:
t = ListNode(d)
l1.next =t
l1_end = l1
l1 = l1.next
l2 = l2.next
while l1:
if l1.val<10:
break
else:
d = l1.val//10
l1.val %= 10
if l1.next:
l1.next.val +=d
else:
t = ListNode(d)
l1.next =t
l1 = l1.next
if l2:
l1_end.next = l2
while l2:
if l2.val<10:
break
else:
d = l2.val//10
l2.val %= 10
if l2.next:
l2.next.val +=d
else:
t = ListNode(d)
l2.next =t
l2 = l2.next
return new_head.next
执行结果
执行用时:60 ms, 在所有 Python3 提交中击败了92.90%的用户
内存消耗:14.8 MB, 在所有 Python3 提交中击败了90.67%的用户
题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。