链表练习——两数相加
链表
链表是最简单的数据结构之一,包括单向链表、双向链表、循环链表。
每条链表都由一系列节点(node)组成,节点包括两部分:数据元素的值(value)和指向下一个节点的指针(next)。
相比数组,链表可以更加灵活的存储数据,不需要知道要存储的数据有多少,这样可以充分利用计算机的内存空间。链表可以再任意位置插入或删除数据,但是不允许随意读取数据。
在python3中定义一个链表数据结构:
class Listnode:
def __init__(self, data):
self.value = data
self.next = None
Leetcode两数相加
问题描述:给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思考:这里会出现两个问题
(1)两个链表不一样长(包括一个链表是空链表的情况)
(2)最后会出现进位
解决方法:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
listnode_1 = l1
listnode_2 = l2
listnode_3 = ListNode(0)
listnode_3_copy = listnode_3
carry = 0
while(listnode_1 or listnode_2):
#解决第一个问题
#在循环过程中,如果两个链表中有一个为空,那就赋值为0
num_1 = listnode_1.val if listnode_1 else 0
num_2 = listnode_2.val if listnode_2 else 0
#当前节点相加的结果是两个链表节点的值和进位值进行加和
value = num_1 + num_2 + carry
#由于存在head节点,所以相加结果要将个位上的数字存在结果链表的下一个节点中
#并将相加结果的十位上的数字赋值给进位变量carry
listnode_3_copy.next = ListNode(value % 10)
carry = value // 10
#当前节点计算后,要将链表节点转到下一个节点上
#如果有一个链表为空,就赋值为0
if listnode_1 != None:
listnode_1 = listnode_1.next
if listnode_2 != None:
listnode_2 = listnode_2.next
#将结果链表的节点转到下一节点处
listnode_3_copy = listnode_3_copy.next
#解决第二个问题
#判断两个链表最后一个节点相加后是否存在进位的情况,如果有就将进位值赋给结果链表的下一个节点
if carry != 0:
listnode_3_copy.next = ListNode(carry)
#返回结果链表
return listnode_3.next