python刷leetcode 2_零基础python刷leetcode -- 2. Add Two Numbers

算法很重要,但是每天也需要学学python,于是就想用python刷leetcode 的算法题,和我一起开始零基础python刷leetcode之旅吧。

5875efe4748d

image.png

首先过一下python的一些基础知识,非小白请直接跳过

链表

从提示代码可以看出这里涉及到单链表结构,代码如下:

# Definition for singly-linked list.

# class ListNode(object):

# def __init__(self, x):

# self.val = x

# self.next = None

链表由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间。

使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

但是链表失去了数组随机读取的优点

同时链表由于增加了结点的指针域,空间开销比较大。

链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表 双向链表 以及 循环链表 。链表可以在多种编程语言中实现。

链表是数据结构中最基本常用的,C++语言中单链表是利用指针操作实现的,python作为面向对象编程的,可以使用创建一个ListNode类来实现链表,利用类的属性引用来代替指针操作。

5875efe4748d

链表

表头,指针,结点等概念请自行百度。

下面我们创建了一个节点类,然后编写了几个链表操作,包括创建,插入,删除,输出等。代码如下:

class ListNode(): # 初始化 构造函数

def __init__(self,value):

self.value=value

self.next=None

def Creatlist(n):

if n<=0:

return False

if n==1:

return ListNode(1) # 只有一个节点

else:

root=ListNode(1)

tmp=root

for i in range(2,n+1): # 一个一个的增加节点

tmp.next=ListNode(i)

tmp=tmp.next

return root # 返回根节点

def printlist(head): # 打印链表 (遍历)

p=head

while p!=None:

print p.value

p=p.next

def listlen(head): # 链表长度

c=0

p=head

while p!=None:

c=c+1

p=p.next

return c

def insert(head,n): # 在n的前面插入元素

if n<1 or n>listlen(head):

return

p=head

for i in range(1,n-1): # 循环四次到达 5 (只能一个一个节点的移动 range不包含n-1)

p=p.next

a=raw_input("Enter a value:")

t=ListNode(value=a)

t.next=p.next

p.next=t

return head

def dellist(head,n): # 删除链表

if n<1 or n>listlen(head):

return head

elif n is 1:

head=head.next # 删除头

else:

p=head

for i in range(1,n-1):

p=p.next # 循环到达 2次

q=p.next

p.next=q.next # 把5放在3的后面

return head

def main():

print "Create a linklist"

head=Creatlist(7)

printlist(head)

print

print "___________________________"

n1=raw_input("Enter the index to insert")

n1=int(n1)

insert(head,n1)

printlist(head)

print

print "___________________________"

n2=raw_input("Enter the index to delete")

n2=int(n2)

dellist(head,n2)

printlist(head)

if __name__=='__main__': main() # 主函数调用

题目

这道题目是要将两个单链条相加。输出得到的新链条。

类似加法的原理, 我们从低位(链条第一位)开始,同位相加,满10高位+1

ans = ListNode(0)

tmp = ans

tmpsum = 0

while True:

#依次遍历l1 l2,对应位相加

if l1 != None:

tmpsum += l1.val

l1 = l1.next

if l2 != None:

tmpsum += l2.val

l2 = l2.next

tmp.val = tmpsum % 10 # 除10取余作为当前位的值

tmpsum //= 10 #除10取整,即高位,作为指针的下个结点 进行加法运算

if l1 == None and l2 == None and tmpsum == 0:

break

tmp.next = ListNode(0)

tmp = tmp.next

return ans

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值