[Python LeetCode] 2_两数之和(yangyang)

@Python

Python LeetCode2_两数之和

题目:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

**题目分析:**这是一道数据结构链表的题目,主要问题在于链表节点整数相加后会产生进位问题。
**解决方案1:**将链表print为数组,数组元素对应位置相加(利用十进制位数转换),输出一个整数,这样不用考虑两个数组长度不相等的问题,再利用取余逆序输出。

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

class Solution:
    
    def get_list(l: ListNode):
        getlist = []
        length = 0
        p = l
        while p is not None:
            getlist.append(p.val)
            length += 1
            p = p.next
        return getlist, length
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        getlist1, length1 = Solution.get_list(l1)
        getlist2, length2 = Solution.get_list(l2)
        if (length1 >length2):
            length2 = length1
            length=getlist2.extend([0] * (length1 - length2))
        else:
            length=length1 = length2
            getlist1.extend([0] * (length2 - length1))
        sum1=0
        sum2=0
        for i in range(len(getlist1)):
            sum1+=getlist1[i]*(10**i)
        for i in range(len(getlist2)):
            sum2+=getlist2[i]*(10**i)
        twosum=sum1+sum2
        addsum=[]
        tag=1
        while(tag!=0):
            addsum.append(twosum%10)
            tag=twosum//10
        return addsum

出现的问题:复杂度过大,没有考虑到链表的特性,盲目转化为数组运算,得不偿失。
新的语法get:两个数组按元素四则运算:sum=list(map(lambda x:x[0]+x[1]),zip(实参1,实参2))

**解决方案2:**针对链表每个节点数据域相加得到的进位情况进行取余和取整(进位为1),同时输出链表的下一个指向为1。用tag标记进位,并加入每次取余和取整运算之中。类似加法器。链表长度不相等用是否为None判断。

# 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:
        carry=0                          #进位
        #初始化空链表头节点
        temp = ListNode(0)
        res=temp
        # 如果有一个链表为空,返回另外一个
        if l1 is None:
            return l2
        if l2 is None:
            return l1
        while(l1 or l2):                #两个链表均不空继续执行 
            list_sum=0
            if l1:                       #不能用循环,而是判断
                list_sum+=l1.val
                l1=l1.next
            if l2:
                list_sum+=l2.val
                l2=l2.next
            rem=(list_sum+carry)%10          #取余,生成新链表节点存储值
            carry=(list_sum+carry)//10        #进位
            #res.next=rem 错误
            res.next=ListNode(rem)            #更新新链表元素
            res=res.next                              #更新节点
            if carry:
                res.next=ListNode(1)      #新链表进位
        res=temp.next                         #因为self.next = None,尾节点
        del temp
        return res

[Python LeetCode] 2_两数之和(yangyang)