python算法之旅(2)- Add Two Numbers

# 轉載請註明出處 http://blog.csdn.net/qq_34175893/article/details/79636790

# 打算開始用python學習算法,並進行一系列的學習過程及心得體會的記錄,歡迎大家持續關注,一起學習。歡迎大家提出意見或建議

# 不關心問題的解決,只關心不同的解決的問題的思路,所有的思路均在代碼中註釋,大家邊看代碼邊看思路,

# _*_ coding:utf-8 _*_
'''
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
'''
# 在閱讀下面的註釋的時候請注意:這裏我一開始犯了一個錯誤,混淆了list和ListNode類型,
# 所以我認爲可行的方案solution0均是基於list的,Solution1之後的纔是是基於ListNode的
class Solution0(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        len1 = len2 = 0
        '''
        
        下面註釋是一些求長度的方法,所有方法在IDE中均可通過,但是一到LeetCode就跪了,MMP
        求長度1
        len1=len(l1)
        len2=len(l2)
        如果是在自己的IDE裏面,直接使用len()就行了,但是要提交到LeetCode上還是乖乖自己求len吧
        
        
        '''
        '''
        求長度2
        len1=len2=0
        for l in l1:
            len1+=1
        for l in l2:
            len2+=1
            
        這TM也不行???
        TypeError: 'ListNode' object is not iterable
        '''
        if len1>=len2:
            for i in range(0,len2):
                l1[i]+=l2[i]
                if l1[i]>=10:
                    l1[i]%=10
                    l1[i+1]+=1
            return l1
        else:
            for i in range(0,len1):
                l2[i]+=l1[i]
                if l2[i]>10:
                    l2[i]%=10
                    l2[i+1]+=1
            return l1

'''
# mmp在LeetCode 的ListNode類裏面沒有len()方法,其ListNode類定義如下
        class ListNode: 
            def init(self, x):
                self.val = x
                self.next = None
'''
# 講真的,這個時間真的不能太在意,
# 同樣一份代碼,前後兩次運時間差異在60ms波動,第一次運行了200ms,結果排名還不到10%
# 需要注意的就是ListNode在IDE中會報錯
# 146ms 53.42%
class Solution1(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        dummy, flag = ListNode(0), 0
        head = dummy
        while flag or l1 or l2:
            node = ListNode(flag)
            if l1:
                node.val += l1.val
                l1 = l1.next
            if l2:
                node.val += l2.val
                l2 = l2.next
            flag = node.val / 10
            node.val %= 10
            head.next = node
            head = head.next  # head.next, head = node, node
        return dummy.next
# 140ms 72.39%
class Solution2(object):
    def addTwoNumbers(self,l1,l2):
        if not l1: return l2
        if not l2: return l1
        dummy = ListNode(0)
        p = dummy
        flag = 0
        while l1 and l2:
            tmp = l1.val + l2.val + flag
            p.next = ListNode(tmp % 10)
            flag = tmp / 10
            l1, l2, p = l1.next, l2.next, p.next
        if l1:
            while l1:
                tmp = l1.val + flag
                p.next = ListNode(tmp % 10)
                flag = tmp / 10
                l1, p = l1.next, p.next
        if l2:
            while l2:
                tmp = l2.val + flag
                p.next = ListNode(tmp % 10)
                flag = tmp / 10
                l2, p = l2.next, p.next
        if flag == 1: p.next = ListNode(flag)
        return dummy.next
本題參考http://www.cnblogs.com/lupx/p/leetcode-2.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章