每天一道leetecode:2 兩數之和(medium)

一開始沒在意給的是自定義的數據結構鏈表,直接用list去做了,開始的代碼如下:

def addTwoNumbers(l1, l2):
    # 計算l1和l2的長度
    len1 = len(l1)
    len2 = len(l2)

    # 計算l1的值
    l1_value = 0
    for i in range(len1):
        index = len1 - i - 1
        num_mul = index
        num_data = l1[index]
        while num_mul!=0:
            num_data = num_data * 10
            num_mul = num_mul - 1
        l1_value = l1_value + num_data

    # 計算l2的值
    l2_value = 0
    for i in range(len2):
        index = len2 - i - 1
        num_mul = index
        num_data = l2[index]
        while num_mul!=0:
            num_data = num_data * 10
            num_mul = num_mul - 1
        l2_value = l2_value + num_data

    # 得到反向的加和結果
    sum_value = l1_value + l2_value
    y = list()
    while sum_value != 0:
        y.append(sum_value % 10)
        sum_value = int(sum_value/10)

    return y


a = list()
a.append(2)
a.append(4)
a.append(3)
b = list()
b.append(5)
b.append(6)
b.append(4)
print(addTwoNumbers(a,b))

然後發現,要使用它給的自定義的list,然後修改了代碼,將自定義的轉化爲python自帶的,信心滿滿去提交,結果血崩:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def addTwoNumbers(l1, l2):

    # 將自定義的結構轉化爲python自帶的list
    k1 = list()
    k2 = list()
    while l1!=None:
        k1.append(l1.val)
        l1 = l1.next

    while l2!=None:
        k2.append(l2.val)
        l2 = l2.next

    # 計算l1和l2的長度
    len1 = len(k1)
    len2 = len(k2)

    # 計算l1的值
    l1_value = 0
    for i in range(len1):
        index = len1 - i - 1
        num_mul = index
        num_data = k1[index]
        while num_mul!=0:
            num_data = num_data * 10
            num_mul = num_mul - 1
        l1_value = l1_value + num_data

    # 計算l2的值
    l2_value = 0
    for i in range(len2):
        index = len2 - i - 1
        num_mul = index
        num_data = k2[index]
        while num_mul!=0:
            num_data = num_data * 10
            num_mul = num_mul - 1
        l2_value = l2_value + num_data

    # 得到反向的加和結果
    sum_value = l1_value + l2_value
    y = ListNode(0)
    x = y
    while sum_value != 0:
        y.val = sum_value % 10
        sum_value = int(sum_value / 10)
        if sum_value!=0:
            y.next = ListNode(0)
            y = y.next

    return x

 額,給了很大的數,估計就崩在這裏了; 

簡單想了想,查了一下,python3沒有長整型,完犢子,不能用兩個數相加來做了,必須重構代碼了,血崩!!!

先去打個球吃個飯,哈哈哈

回來了,好吧,一個字符一個字符相加判斷吧,哭哭...

做出來了,中間出了一堆bug

最終成功代碼:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def addTwoNumbers(l1, l2):

    y = ListNode(0)
    x = y
    add_one = 0
    # 當兩個都不爲空時
    while l1 != None and l2 != None:
        print('111')
        if l1.val + l2.val >= 10:
            y.next = ListNode(0)
            y = y.next
            y.val = ((l1.val + l2.val) % 10 + add_one)
            add_one = 1
            l1 = l1.next
            l2 = l2.next
        else:
            y.next = ListNode(0)
            y = y.next
            if l1.val + l2.val + add_one >= 10:
                y.val = (l1.val + l2.val + add_one) % 10
                add_one = 1
            else:
                y.val = (l1.val + l2.val + add_one)
                add_one = 0
            l1 = l1.next
            l2 = l2.next
    if l1 == None and l2 != None:
        print('222')
        while l2 != None:
            y.next = ListNode(0)
            y = y.next
            if l2.val + add_one >= 10:
                y.val = (l2.val + add_one) % 10
                add_one = 1
            else:
                y.val = (l2.val + add_one)
                add_one = 0
            l2 = l2.next
    if l2 == None and l1 != None:
        print('333')
        while l1 != None:
            y.next = ListNode(0)
            y = y.next
            if l1.val + add_one >= 10:
                y.val = (l1.val + add_one) % 10
                add_one = 1
            else:
                y.val = (l1.val + add_one)
                add_one = 0
            l1 = l1.next
    if l1 == None and l2 == None:
        if add_one == 1:
            print('444')
            y.next = ListNode(1)
            y = y.next
            y.val = 1
        return x.next
    return x.next


l1 = ListNode(1)
l1.next = ListNode(0)
l1.next.next = ListNode(0)
l1.next.next.next = ListNode(0)
l1.next.next.next.next = ListNode(0)
l1.next.next.next.next.next = ListNode(0)
l1.next.next.next.next.next.next = ListNode(0)
l1.next.next.next.next.next.next.next = ListNode(0)
l1.next.next.next.next.next.next.next.next = ListNode(0)
l1.next.next.next.next.next.next.next.next.next = ListNode(0)
l1.next.next.next.next.next.next.next.next.next.next = ListNode(0)
l1.next.next.next.next.next.next.next.next.next.next.next = ListNode(0)
l1.next.next.next.next.next.next.next.next.next.next.next.next = ListNode(0)
l1.next.next.next.next.next.next.next.next.next.next.next.next.next = ListNode(0)
l1.next.next.next.next.next.next.next.next.next.next.next.next.next.next = ListNode(0)
p = l1.next.next.next.next.next.next.next.next.next.next.next.next.next.next
p.next = ListNode(0)
p.next.next = ListNode(0)
p.next.next.next = ListNode(0)
p.next.next.next.next = ListNode(0)
p.next.next.next.next.next = ListNode(0)
p.next.next.next.next.next.next = ListNode(0)
p.next.next.next.next.next.next.next = ListNode(1)


l2 = ListNode(3)
l2.next = ListNode(7)
l3 = ListNode(9)
l3.next = ListNode(2)

l4 = ListNode(5)
l5 = ListNode(5)

l6 = ListNode(9)
l7 = ListNode(9)
l7.next = ListNode(9)



y = addTwoNumbers(l2,l3)
while y.next!=None:
    print(y.val)
    y = y.next

這道題其實蠻簡單的,沒有什麼複雜性,主要是細節要注意。

今日leetecode完成!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章