1. 题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
2. 我的代码:
# 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]: # 定义个result result = ListNode(); result_return = result; # 存储 进位 plus_next = 0; # 循环体 while l1 != None or l2 != None: # 计算求和结果 plus = l1.val + l2.val + plus_next; # 判断是否要进位 plus_next = 0; p = False; if plus > 9: p = True; plus_next = plus // 10; plus %= 10; # 当前位加和 result.val = plus; if l1.next == None and l2.next == None and p == False: l1 = l1.next; l2 = l2.next; break # 下一阶 result.next = ListNode(); if l1.next == None: l1.next = ListNode(); l1.next.val = 0; if l2.next == None: l2.next = ListNode(); l2.next.val = 0; result = result.next; l1 = l1.next; l2 = l2.next; return result_return;
框架是1.定义预先用到的变量,2.循环,3.返回值
重点是循环:
- 循环内首先计算出此位数相加后的结果(这里包括前一位的进位)
- 如果计算出来的值大于9的话则说明要向下一位进位(进位的值就是对10求除,保留的值就是对10求余)
- 此位加上保留的值后就无需多虑了
- 然后就要考虑下一位该如何处理,看似可以方向到下一阶段,但是因为有可能一个链表完了但是另一个链表没完,然后就退出循环了。所以,这里最优(如果不这样后面会出一些问题,可能会出现最后一个数字是0的情况)的办法就是续上链表(# 下一阶),续上的值当然为0
- 然后什么时候结束呢?那就是再在他们两个的next都是空的时候,但是,比如8+8=16,这里并不能直接结束,还需要一个条件就是:不进位。在不进位的时候他们继续往下续链表,然后算出0+0+6=6
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 = 0 n1, n2 = l1, l2 head = ListNode() node = head while n1 or n2 or cur: if n1: cur += n1.val n1 = n1.next if n2: cur += n2.val n2 = n2.next node.next = ListNode(cur % 10) node = node.next cur //= 10 return head.next
由于位数是严格一一对应的,所以不会错位,所以可以if n1和if n2这样判断且直接相加求val的值,达到不越链表的界的效果。