用python手刃Leetcode(2):兩數相加

前言

博客裏新開一個「用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
複製代碼
解題收穫:
一、收穫1

未完待續…………

相關文章
相關標籤/搜索