LeetCode 2 两数相加

题目位置:https://leetcode-cn.com/problems/add-two-numbers/description/

大致解题思路:

     遍历每个位置的l1和l2,逐个位置相加,相加结果node_val大于等于10的话,就保留node_val-10的部分,并且向下一位进位+1,如果p的后一个位置为None,则创建新的节点赋值为1,否则当前节点值为node_val

错误原因:

    l2长度大于l1时,无法正确连接l2超出l1的部分

复习知识点:

    1.Python 深拷贝,浅拷贝

    2.Python 关于“=”号赋值,引用的关系

   

分析:

    1.Python类似于C中的指针运算可以直接用“=”号计算,此时二者内存地址相等

扫描二维码关注公众号,回复: 4209661 查看本文章

    “在 python 中赋值语句总是建立对象的引用值,而不是复制对象。因此,python 变量更像是指针,而不是数据存储区域,

    

   2. (主要原因)Python 中变量赋值是在内存中创建新的空间存储变量值,直接p1 = p2,会导致p1和前面的“链”断掉,所以正确的做法应该是p1.next = p2来保持“链”在一起


运行成功的代码:

    

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None
def addTwoNumbers(l1, l2):

    """

    :type l1: ListNode

    :type l2: ListNode

    :rtype: ListNode

    """
    if l1 == None:

        return l2

    if l2 ==None:

        return l1

    p1 = l1

    p2 = l2

    ans = ListNode(0)

    while p1 != None:

        if p2 != None:

            node_val = p1.val + p2.val

            if node_val >= 10:

                node_val =  node_val-10

                if p1.next!=None:

                    p1.next.val += 1

                else:

                    p1.next = ListNode(1)

            p1.val = node_val

            p2 = p2.next

        else:
            if p1.val >=10:

                p1.val = p1.val-10

                if p1.next !=None:

                    p1.next.val +=1
                else:
                    p1.next = ListNode(1)

        if p1.next == None:
            break
        else:
            p1 = p1.next

    if p2 != None:#(p1 == None,and p2!= none)

        p1.next = p2

    return l1

更好的做法:

  没有想到的点:

     1.while l1 or l2,这样循环的话就可以不用管到底是哪个链表更长,,循环直到两个链表都为None,都为None后再看看最后一次有没有进位,如果有进位的话就+1

      2. while内l1和l2两个if分开来向后移动

         l1= l1.next

         l2=l2.next

    3.这里采用了头结点tmp,赋值的时候都是统一通过res.next = ListNode(VALUE)来赋值,这样可以避免链表结构“断链”的情况发生,最后返回的时候res = tmp.next返回res

# Definition for singly-linked list.
# 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
        """
        if l1 is None:
            return l2
        if l2 is None:
            return l1
 
        tmp = ListNode(0)
        res = tmp
        flag = 0
        while l1 or l2:
            tmpsum = 0
            if l1:
                tmpsum = l1.val
                l1 = l1.next
            if l2:
                tmpsum += l2.val
                l2 = l2.next
            tmpres = ((tmpsum + flag) % 10)
            flag = ((tmpsum + flag) // 10)
            res.next = ListNode(tmpres)
            res = res.next
        if flag:
            res.next = ListNode(1)
        res = tmp.next
        del tmp
        return res

猜你喜欢

转载自blog.csdn.net/qq_28327765/article/details/82916446