leetcode每日一題 python解法 4月14日

難度:中等

題目內(nèi)容:

給你兩個 非空 鏈表來代表兩個非負整數(shù)。數(shù)字最高位位于鏈表開始位置。它們的每個節(jié)點只存儲一位數(shù)字。將這兩數(shù)相加會返回一個新的鏈表。

你可以假設(shè)除了數(shù)字 0 之外,這兩個數(shù)字都不會以零開頭。

進階:

如果輸入鏈表不能修改該如何處理?換句話說,你不能對列表中的節(jié)點進行翻轉(zhuǎn)。

示例:

輸入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 8 -> 0 -> 7

題解:

emmm
首先最簡單的情況就是有數(shù)為0 ,直接返回另一個就好了
其他的情況可以先把列表翻轉(zhuǎn)過來,然后相加的出一個新列表,把新列表再翻轉(zhuǎn)一下就得到結(jié)果了。
不過題目要求不能進行翻轉(zhuǎn)
emmm那也好說,我們加一個位數(shù)計數(shù)就好了
不過要注意的是(反正我出錯了)相加是可能進多位的(199+1這樣)
我下面這個就算初步修改了一下,但是只能解決進兩位。。。所以打算換種方法,先算出來,然后把中間變成兩位的數(shù)拆開就好了嘛,比如10拆成1 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:
        ###如果有0的話
        if l1.val == 0:
            return l2
        elif l2.val == 0:
            return l1
        l1len = 0
        l1c = l1
        while l1c:
            l1c = l1c.next
            l1len += 1
        l2len = 0
        l2c = l2
        while l2c :
            l2c = l2c.next
            l2len += 1
        if l2len >= l1len:
            return self.sum(l2,l2len,l1,l1len)
        elif l2len < l1len:
            return self.sum(l1,l1len,l2,l2len)

    def sum(self,lbig,lbiglen,lsmall,lsmalllen):
        # if lbiglen == lsmalllen and (lbig.val +lsmall.val) >= 10:
        #     r = ListNode(1)
        r0 = ListNode(0)
        r = r0
        while lbig:
            if lbiglen == lsmalllen:
                if  (lbig.val +lsmall.val) >= 10:
                    r.val += 1

                r.next = ListNode(mod( (lbig.val +lsmall.val) ,10))
                if r.next.val == 9:#預警一下會不會連進兩位
                    temp = r
                r = r.next
                lbig = lbig.next
                lbiglen -= 1
                lsmall = lsmall.next
                lsmalllen -= 1
            else:
                r.next = ListNode(lbig.val)
                if r.next.val == 9:#預警一下會不會連進兩位
                    temp = r
                r = r.next
                lbig = lbig.next
                lbiglen -= 1
        if r0.val == 0 and r0.next:
            r0 = r0.next
        return r0

稍加改動,就可以通過啦!

# 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的話
        if l1.val == 0:
            return l2
        elif l2.val == 0:
            return l1
        l1len = 0
        l1c = l1
        while l1c:
            l1c = l1c.next
            l1len += 1
        l2len = 0
        l2c = l2
        while l2c :
            l2c = l2c.next
            l2len += 1
        if l2len >= l1len:
            return self.sum(l2,l2len,l1,l1len)
        elif l2len < l1len:
            return self.sum(l1,l1len,l2,l2len)

    def sum(self,lbig,lbiglen,lsmall,lsmalllen):
        # if lbiglen == lsmalllen and (lbig.val +lsmall.val) >= 10:
        #     r = ListNode(1)
        r0 = ListNode(0)
        r = r0
        while lbig:
            if lbiglen == lsmalllen:
                if  (lbig.val +lsmall.val) >= 10:
                    r.val += 1
                r.next = ListNode(mod( (lbig.val +lsmall.val) ,10))
                r = r.next
                lbig = lbig.next
                lbiglen -= 1
                lsmall = lsmall.next
                lsmalllen -= 1
            else:
                r.next = ListNode(lbig.val)
                r = r.next
                lbig = lbig.next
                lbiglen -= 1
        if r0.val == 0 and r0.next:
            r0 = r0.next
        # 拆數(shù)
        
        l = lbiglen

        r = r0
        carry = True
        while carry:
            carry = False
            r = r0
            while r.next:
                if r.next.val >= 10:
                    r.val += 1
                    r.next.val -= 10
                    carry = True
                r = r.next
        # 第一位大于等于10要變成兩個數(shù)
        if r0.val >= 10:
            newNode = ListNode(mod(r0.val,10))
            newNode.next = r0.next
            r0.val = r0.val // 10
            r0.next = newNode
            l += 1
        return r0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 搞懂單鏈表常見面試題 Hello 繼上次的 搞懂基本排序算法,這個一星期,我總結(jié)了,我所學習和思考的單鏈表基礎(chǔ)知識...
    醒著的碼者閱讀 4,731評論 1 45
  • LeetCode-鏈表 鏈表(Linked List)是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會按線性的順...
    raincoffee閱讀 1,324評論 0 6
  • 1. 找出數(shù)組中重復的數(shù)字 題目:在一個長度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)。數(shù)組中某些數(shù)字是重復的,...
    BookThief閱讀 1,999評論 0 2
  • (一)LeetCode206.反轉(zhuǎn)鏈表 題目描述: 反轉(zhuǎn)一個單鏈表。 代碼實現(xiàn) (二)LeetCode160. 相...
    Jarily閱讀 1,476評論 0 5
  • 概述 本文是從leetcode題庫中精選出的關(guān)于鏈表的題目,在面試中具有較高的出現(xiàn)頻率。 160. 相交鏈表 編寫...
    進擊的李同學閱讀 627評論 0 1

友情鏈接更多精彩內(nèi)容