算法很重要,但是每天也需要學學python,于是就想用python刷leetcode 的算法題,和我一起開始零基礎python刷leetcode之旅吧。
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類來實現鏈表,利用類的屬性引用來代替指針操作。
鏈表
表頭,指針,結點等概念請自行百度。
下面我們創建了一個節點類,然后編寫了幾個鏈表操作,包括創建,插入,刪除,輸出等。代碼如下:
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