1. 程式人生 > >【python】【leetcode】【演算法題目2—Add Two Numbers】

【python】【leetcode】【演算法題目2—Add Two Numbers】

一、題目描述

題目原文:

You are given two linked lists representing two non-negative numbers.

The digits are stored in reverse order and each of their nodes contain a single digit.

Add the two numbers and return it as a linked list.

(兩個單鏈表分別表示兩個非負整數,表示形式為:數字個位—>數字十位—>數字百位........請以相同的單鏈表的形式返回兩個數的和的結果)

舉例:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

舉例:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

注意:最終結果要用連結串列結構表示,返回指向首節點的物件(Python中一切皆物件)。

二、題目分析

我想到的思路比較直接:先把倆個數字用列表表示出來,再轉化為整型後進行相加,最後構造相加結果的單鏈表返回即可。

三、Python程式碼

#題目中定義的單鏈表類的結構如下:
#class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        l1,l2為輸入的待加和的兩個串
        """
        
        #將兩個單鏈表串按位掃到列表listnum1和listnum2中
        listnum1 = []
        listnum2 = []
        while l1 != None:
            listnum1.append(l1.val)
            l1 = l1.next
        while l2 != None:
            listnum2.append(l2.val)
            l2 = l2.next
        
        #將兩個數用整型num1和num2表示出來(**運算為指數運算,eg. 2 ** 3 結果為8)
        num1 = 0
        num2 = 0
        for i in range(len(listnum1)):
            num1 = listnum1[i] * (10 ** i) + num1
        for j in range(len(listnum2)):
            num2 = listnum2[j] * (10 ** j) + num2
            
        #計算結果後,構造結果的單鏈表結構l3
        result = num1 + num2
        l3 = ListNode(0)
        p = ListNode(0)
        p = l3
        #l3和p指向首節點,構造過程中l3不動,仍指向首節點,p進行構造移動
        while result >= 10:
            temp = ListNode(None)
            p.val = result % 10
            p.next = temp
            p = temp
            result = result / 10
        #由於迴圈到最後一個節點時不再構造新節點,於是退出迴圈,並給最後一個節點賦值
        p.val = result % 10
        return l3


四、其他