算法很重要,但是每天也需要学学python,于是就想用python刷leetcode 的算法题,和我一起开始零基础python刷leetcode之旅吧。
首先过一下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类来实现链表,利用类的属性引用来代替指针操作。
表头,指针,结点等概念请自行百度。
下面我们创建了一个节点类,然后编写了几个链表操作,包括创建,插入,删除,输出等。代码如下:
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