前言
博客裏新開一個「用python手刃Leetcode」的專題,顧名思義,主要目的是記錄本身在Leetcode上刷題的過程,代碼全程用python3編寫,所用網址是:leetcode中國。這個網址的好處是:1)純中文,解決了英語很差讀題困難的問題;2)網頁打開速度快。 ` 同時能夠看到:目前官網給出的解題代碼是用java編寫的,並無給出官方的python解答,本專欄除了儘可能使用多種解法給出每道題的python3解答代碼以外,還會記錄下本身在作題過程當中的一些收穫和思考。便於之後複習查閱。java
給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每一個節點只存儲單個數字。將兩數相加返回一個新的鏈表。python
你能夠假設除了數字 0 以外,這兩個數字都不會以零開頭。數組
示例:數據結構
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)spa
1) 這道題沒有說明鏈表的長度相同,因此須要考慮鏈表長度不一樣的狀況。指針
2) 這道題有一個條件:你能夠假設除了數字 0 以外,這兩個數字都不會以零開頭。這就說明,除了單獨的一個數字零以外,剩下的這個鏈表裏不會出現以0組成的數字,也就是說能夠用是否爲0來判斷鏈表是否到了尾巴。code
本題中用到了鏈表這個數據結構。顧名思義,鏈表就像鎖鏈同樣,由一各個節點連在一塊兒,組成一條數據鏈。每個節點由兩部分組成:數據,下一個數據的位置。其中頭節點能夠不存儲數字,尾節點沒有下一個數據的位置。形象表示就是這個: cdn
鏈表相對於數組解決的是數據的快速插入,刪除問題。好比說:有一堆數據1,2,3,5,6,7咱們要在3和5之間插入4,若是用數組存儲,插入時就要將5以後的數據都日後退一位,而後再插入4,這樣很是麻煩,可是若是用鏈表,直接3和5的「鏈條」斷開,而後接上4就行。對象
鏈表用C(C++)語言實現最爲方便,由於其有指針,能夠很方便地在內存中跳來跳去。blog
而在python中,實現須要用到其動態語言的特性,直接把對象賦值給新的變量。
在解題模板裏,其實已經給出了鏈表類的定義方法,即定義一個ListNode類,而後進行一個初始化(其實也能夠把插入,刪除等操做定義在鏈表方法裏,這裏咱們先無論):
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
複製代碼
雖然給出的模板中這段語句是被註釋掉的,可是其實LeeCode的官方解釋器中已經定義好了這個類,由於類已經定義好,咱們按照定義調用便可。好比:建立一個值爲1的鏈表頭:L1 = ListNode(1)
。
理解了以上知識點,下面就開始解題:
class Solution:
def addTwoNumbers(self, l1, l2):
""" :type l1: ListNode :type l2: ListNode :rtype: ListNode """
head = R = ListNode(0)
flag = 0 # 用來標記是否有進位
while l1 and l2:
if flag == 1:
add = l1.val + l2.val + 1
l1 = l1.next
l2 = l2.next
else:
add = l1.val + l2.val
l1 = l1.next
l2 = l2.next
if add>=10 :
flag = 1
add = add-10
R = ListNode(add)
R = R.next
else:
flag = 0
R = ListNode(add)
R = R.next
return head.next
複製代碼
未完待續…………