链表:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题分析:
通俗的讲就是从两个非空的链表获取节点值做一个加法,生成新的一个链表。根据事例提出几个问题:
①怎么确定第一个节点?
②假如我们确定了头节点是7,当我们移向下一个节点的时候,怎么留住之前的节点7呢?
dummyHead虚拟头节点:
对于单链表来说,唯一能让它保持联系就是它的头节点,对于事例来说7就是我们的头节点,但是在计算出头节点7之前,我们不知道头节点是什么。这里我们有一个通用的做法:建立一个dummyHead,我们初始一个头节点是0,在计算完链表之后,我们只需要获取dummyHead.next,就是我们想要的链表。
ListNode dummyHead = new ListNode(0); 指针节点:
为了解决第二个问题,当获取到两个链表的头节点2和5计算得到dummyHead的 头节点指向了7,但是我们需要移动dummyHead = dummyHead .next 到下一个节 点,才能对两个链表的4和6计算赋值给dummyHead,这样的话dummyHead的头节点 7相当于就被移除了,所以我们需要一个指针节点curr来指向dummyHead,当curr 移动的时候,dummyhead始终保持节点。
作者:ran-10 链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-xiao-ji-qiao-zhi-dummyheadhe-z/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 # Definition for singly-linked list. 2 # class ListNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution: 8 def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: 9 dummy = p = ListNode(None) #保存头结点,返回结果 10 s = 0 #每一步的求和暂存变量 11 while l1 or l2 or s: #循环条件:l1 或者l2(没有遍历完成),s(进位)不为0 12 s += (l1.val if l1 else 0) + (l2.val if l2 else 0) #这其实是好多代码,我自己写了好多行,但是作者这样写非常简洁,赞 13 p.next = ListNode(s % 10) #构建新的list存储结果,其实用较长的加数链表存也可以,%10:求个位 14 p = p.next 15 s //= 10 #求进位 16 l1 = l1.next if l1 else None 17 l2 = l2.next if l2 else None 18 return dummy.next
怎么说呢,还是不太理解,python里面运行链表不熟悉,直接说就是对链表这个东西不熟悉,明天再写一篇自己的解法
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2769.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...