两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
输入:l1 = [0], l2 = [0]
输出:[0]
输入: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
题目数据保证列表表示的数字不含前导零
Problem: 2. 两数相加
思路
首先这道题是利用两个单链表进行操作,排除各种特殊情况,只需要设置两个指针,t1和t2,分别指向输入的两个单链表,通过将t1.val+t2.val的值赋值给一个新的结点,之后将节点连接起来便解决了。其中特殊情况有:
①t1.val+t2.val会大于10,此时要保存对10取余的结果到新节点上;并且设置一个进位变量jin,每次的求和改为t1.val+t2.val+jin;jin变量在每次求和判断不大于10的时候就要赋值为0,相反则赋值为1。
②每个节点连接起来,这个时候需要两个节点lq和lb,lq表示上个节点,lb表示当前节点,在把计算结果赋值到lb中后,让lq指向lb,之后再让lq=lb这样通过循环就能连接起来了。
③输入的两个单链表长度可能不同,所以再完成了①和②两步后,创建一个指针con等于较长的那个单链表,需要再次创建一个循环,循环中只需要con.val+jin赋值给lb.val。
复杂度
- 时间复杂度:
添加时间复杂度, 示例: O ( m a x ( n + m ) ) O(max(n+m)) O(max(n+m))
- 空间复杂度:
添加空间复杂度, 示例: O ( m a x ( n + m ) ) O(max(n+m)) O(max(n+m))
Code
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
l3=ListNode()
now=l1.val+l2.val
jin=0
if now>=10:
jin=1
now=now%10
l3.val=now
lq=ListNode()
lq=l3
t1=l1.next
t2=l2.next
while (t1!=None and t2!=None):
lb=ListNode()
t3=t1.val+t2.val+jin
if t3>=10:
t3=t3-10
jin=1
else:
jin=0
lb.val=t3
lq.next=lb
lq=lb
t1=t1.next
t2=t2.next
con=None
if t1!=None or t2!=None:
if t1!=None:
con=t1
elif t2!=None:
con=t2
while (con!=None):
lb=ListNode()
t3=con.val+jin
if t3>=10:
t3=t3%10
jin=1
else:
jin=0
lb.val=t3
lq.next=lb
lq=lb
con=con.next
if jin==1:
lb=ListNode()
lb.val=1
lq.next=lb
lq=lb
return l3