题目:
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储 一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
<!--示例-->
<!--输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807-->
解题思路:
1.从链表头开始两两相加,记录进位
2.l = l.next(当一个l1或者l2为空时,l1或者l2不再next)
3.当l1,l2均为空时跳出循环,处理剩余进位
**tips:**
1.x = l1.val if l1 else 0
<!--如果l1不为空的时候,则取l1.val;当l1为空的时候,取0-->
2.if l1:l1 = l1.next
<!--当l1不为空,则next;l1为空时,保持原地不动-->
3.return res.next
<!--res链表是带头节点的链表,而题目要求返回不带头节点链表-->
方法:
代码
#定义一个结点类
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
#Python 单链表的定义(单链表是由一个一个结点构成)在结点类的基础上
class LinkList:
# 新建一个头指针为空的链表 (初始化)
def __init__(self):
self.head = None
# 将数据插入链表:(这里必须要说的是最后返回链表的头指针) (赋值)
def initList(self, data):
# 创建头结点
self.head = ListNode(data[0])
r = self.head # r指向的是单链表的头结点
p = self.head # p指向的是单链表的尾结点
# 逐个为 data 内的数据创建结点, 建立链表
for i in data[1:]:
node = ListNode(i)
p.next = node
p = p.next
return r
#(输出)
def printlist(self, head):
if head == None: return 0
node = head
while node != None:
print(node.val, end=' ')
node = node.next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
carry=0
res = ListNode(0)
restemp = res
while l1 or l2:
x = l1.val if l1 else 0
y = l2.val if l2 else 0
sum = x + y + carry
carry = sum // 10
restemp.next = ListNode(sum % 10)
restemp = restemp.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
if carry != 0:
restemp.next = ListNode(1)
return res.next
if __name__ == '__main__':
l = LinkList()
data1 = [2, 4, 3]
data2 = [5, 6, 4]
l1 = l.initList(data1)
l2 = l.initList(data2)
c = Solution()
a = c.addTwoNumbers(l1,l2)
l.printlist(a)