【Leetcode】2:兩數相加(Python)


題目:

 

 解題思路:首先對兩個鏈表進行遍歷,然后將數字轉化為字符串加起來

 然后對整個字符串進行逆序,在逆序的同時賦值給新創建的鏈表

代碼如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        #首先對兩個鏈表進行遍歷,然后將數字轉化為字符串加起來
        #然后對整個字符串進行逆序,在逆序的同時賦值給新創建的鏈表
        
        #首先考慮為0的情況


        #考慮鏈表不為0的情況
        l1_node=[]
        l2_node=[]
        #在儲存進數組里的時候可以直接逆序
        while l1:
            l1_node.insert(0,str(l1.val))
            l1=l1.next

        while l2:
            l2_node.insert(0,str(l2.val))
            l2=l2.next
        #轉化為整數進行相加
        zhengshu=''
        zhengshuer=''
        for i in l1_node:
            zhengshu=zhengshu+i
        
        for j in l2_node:
            zhengshuer=zhengshuer+j

        zhengshu=int(zhengshu)
        zhengshuer=int(zhengshuer)

        summ=str(zhengshu+zhengshuer)
        #將相加得到的整數再次變成字符串,並分割,分別賦值給新的鏈表
        ls=[]
        for i in summ:
            ls.append(i)
        node=ListNode(0)
        pointer=node
        #這里還要進行倒序一次
        i=len(ls)-1
        while i>=0:
            
            node.next=ListNode(int(ls[i]))
            node=node.next
            i=i-1
        
        return pointer.next

得解:

 

 我這個方法還不太行,時間復雜度太大,用了四個並列的循環,之后再來想想有沒有更好的辦法。

方法二:

然后我看了官方的解答,直接使用初等數學方法求解,如下圖所示:

 

 我們可以觀察到鏈表l1和l2正好從前往后遍歷得到的是個位,十位,百位數的數字位數,我們只要把遍歷的結果從前往后分別相加到一個新的鏈表里就正好得到了我們新鏈表的結果,使用carry代表是否進位,carry=1就進位,carry=0就不進位。同時考慮,兩個鏈表長度不相同的情況,於是可寫出以下代碼:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        #直接將對應鏈表元素進行相加,就正好相當於從個位數開始往上面加
        node = ListNode(0)
        pointer = node
        carry = 0
        while l1 != None or l2 != None:
            #那么向后移動到None了后,l2將不會具有val值,這該如何處理?
            if l1!=None and l2!=None:
                if (l1.val + l2.val + carry) >= 10:
                    node.next = ListNode(l1.val + l2.val + carry - 10)
                    node = node.next
                    carry = 1
                if (l1.val + l2.val + carry) < 10:
                    node.next = ListNode(l1.val + l2.val + carry)
                    node = node.next
                    carry = 0
            if l1==None:
                if (l2.val + carry) >= 10:
                    node.next = ListNode(l2.val + carry - 10)
                    node = node.next
                    carry = 1
                if (l2.val + carry) < 10:
                    node.next = ListNode(l2.val + carry)
                    node = node.next
                    carry = 0
            if l2==None:
                if (l1.val + carry) >= 10:
                    node.next = ListNode(l1.val + carry - 10)
                    node = node.next
                    carry = 1
                if (l1.val + carry) < 10:
                    node.next = ListNode(l1.val + carry)
                    node = node.next
                    carry = 0
            if l1 != None:
                
                l1 = l1.next
            if l2 != None:
                l2 = l2.next
                
        if carry == 1:
            node.next = ListNode(1)
            node = node.next


        return pointer.next

最后的運行結果如下所示:

 

 發現運行用時比我自己想的辦法還大,差一點就超時了,這個官方解答真是奇怪。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM