题目位置: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中的指针运算可以直接用“=”号计算,此时二者内存地址相等
“在 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