菜鸟日记day2-力扣第二题

题目如下:

这道题对于我这个菜鸟来说真的很难了,我之前没有接触过数据结构,对于链表这种数据结构是第一次学习,然后我花了一点时间去学习了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

总而言之,太难了。但是也真的学到了一点链表的知识,后续再加强!菜鸟继续加油,我说的不对的地方,大佬口下留人!我虚心求教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值