题目如下:
这道题对于我这个菜鸟来说真的很难了,我之前没有接触过数据结构,对于链表这种数据结构是第一次学习,然后我花了一点时间去学习了python中的链表结构。当然python当中的链表结构有很多,比如单链表和循环链表等。这道题知道是单链表结构了,所以花了点时间去学习最简单的单链表结构。
说实话,这种链表的原理真的很简单,但是只是想着很简单,正儿八经操作起来就知道难受了呜呜呜呜。首先就是要先了解节点是什么东西,如上图的单元格,一个节点包含了数据部分和一个指针,在链表中,节点的指针总是指向下一个节点的地址或者None,但是第一个节点由谁来指呢?我学习的时候也陷入这种困难之中,这时我们只需要定义一个头head(head只是我命名的,你也可以head1,乱七八杂都行,只要是个变量名就行了)来指定,这样咱们就得到了一个单向链表,这种结构很简单。(大脑里想的确实很简单)
之后再看题目的要求,就是对应位置相加嘛,这种题目我可是有心得的,先定义一个flag,用来表示进位与否,因为它说数据部分只能是一个数字,所以flag不是0就是1,所以在两个节点相加之前,检查一下flag就行了,如果flag为1,加的时候加上1,没有就不加,加完之后要判断是否要进位(也就是大于10吗?),如果需要进位,flag不动它,继续为1,为下次做准备。不进位,在你加为1之后,flag马上置为0就ok了。这种想法确实可行,但是在写代码的时候,链表这种数据结构真是把我害惨了。
踩坑
不是两个链表吗,我寻思在定义一个链表用来存加的结果不就行了吗,然后定义了一个
head_3 = ListNode(0)
然后代码执行的结构(我只写了核心代码,没写全是因为这样是有bug的呜呜呜呜,害怕误导大家)就是:
while l1 or l2:
if flag == 1:
total = l1.val + l2.val + 1
if total>= 10:
head_3.next =ListNode(0)
head_3 = head_3.next
else:
head_3.next =ListNode(total)
head_3 = head_3.next
flag = 0
else:
total = l1.val + l2.val
if total>= 10:
head_3.next =ListNode(0)
head_3 = head_3.next
flag = 1
else:
head_3.next =ListNode(total)
head_3 = head_3.next
l1 = l1.next
l2 = l2.next
这样写看似没问题,但是如果两个链表的节点数不相同,马上就出问题了。我百思不得其解,怎么改都改不对,我差不多磨蹭了两个多小时,真的忍不住了。我看题解了,看了题解有种恍然大悟的感觉呜呜呜。
首先我一开始定义新的链表来存储相加的结果,这本身并没有错,但是我这个 过程中,head_3一直在变,也就是说我每次只得到一个相加的值,我看了大佬们的解,才发现可以定义两个头同时指向一个链表对象,这样我操作一个时候,另一个虽然值再跟着变,但头节点没有变化呀。这就是我想要的。回想了一下,这不就是类与对象里面的拷贝操作吗。只是我这里是浅拷贝,所以两个变量指向同一个对象的时候,一个在操作,所指的对象也跟着在变呀。反正就是这个意思,不知道表达清楚没有。直接上代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
cur = dummy = ListNode()
flag = 0
while l1 or l2 or flag:
if l1:
flag += l1.val
l1 = l1.next
if l2:
flag += l2.val
l2 = l2.next
cur.next = ListNode(flag % 10)
flag = flag // 10
cur = cur.next
return dummy.next
总而言之,太难了。但是也真的学到了一点链表的知识,后续再加强!菜鸟继续加油,我说的不对的地方,大佬口下留人!我虚心求教。