LeetCode2:两数之和(链表)

LeetCode2:两数之和(链表)

Difficulty
⭐⭐
Creat
Mar 30, 2022 10:30 AM
LastEdit
Last updated April 19, 2022

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例1:
notion image

解析

关于链表的概念!
# 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 """ re = ListNode(0) r=re carry=0 while(l1 or l2): x= l1.val if l1 else 0 y= l2.val if l2 else 0 s=carry+x+y carry=s//10 r.next=ListNode(s%10) r=r.next if(l1!=None):l1=l1.next if(l2!=None):l2=l2.next if(carry>0): r.next=ListNode(1) return re.next
notion image

补充阅读:链表

数据结构是计算机科学必须掌握的一门学问,很多的教材都是用C语言实现链表,因为C有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表.
数据结构是计算机科学必须掌握的一门学问,很多的教材都是用C语言实现链表,因为C有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表.
因为python是动态语言,可以直接把对象赋值给新的变量。 在C/C++中,通常采用“指针+结构体”来实现链表;而在Python中,则可以采用“引用+类”来实现链表。
链表的定义:是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接
链表的结构:data为自定义的数据,next为下一个节点的地址。
notion image
基本元素
  1. 节点:每个节点有两个部分,左边称为值域,存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。
  1. head:head节点永远指向第一个节点
  1. tail: tail永远指向最后一个节点
  1. None:链表中最后一个节点的指针域为None值
链表种类: 单向链表、单向循环链表、双向链表、双向循环链表
notion image
 
  1. 节点类定义如下,我们将节点类定义成Node,该类在初始化实例对象时,定义了两个实例变量,其中data用来存储节点的值,next用来存储下一个节点的索引:
class Node:     def __init__(self,data = None, next = None):         self.data = data         self.next = next
  1. 定义一个节点,如下创建了三个独立的节点:
node1 = Node(1) node2 = Node(2) node3 = Node(3)
  1. 然后再把每个节点的关系表示出来,就OK了。
node1.next = node2 node2.next = node3
 

链表的操作

1. 遍历

2. 插入

3. 删除

 
 

链表与数组使用场景

比较项
数组使用场景
链表使用场景
空间
数组的存储空间是栈上分配的,存储密度大,当要求存储的大小变化不大时,且可以事先确定大小,宜采用数组存储数据
链表的存储空间是堆上动态申请的,当要求存储的长度变化较大时,且事先无法估量数据规模,宜采用链表存储
时间
数组访问效率高。当线性表的操作主要是进行查找,很少插入和删除时,宜采用数组结构
链表插入、删除效率高,当线性表要求频繁插入和删除时,宜采用链表结构