leetcode代码记录和对比(两数相加

简介: leetcode代码记录和对比(两数相加

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.返回值

重点是循环:

  1. 循环内首先计算出此位数相加后的结果(这里包括前一位的进位)
  2. 如果计算出来的值大于9的话则说明要向下一位进位(进位的值就是对10求除,保留的值就是对10求余)
  3. 此位加上保留的值后就无需多虑了
  4. 然后就要考虑下一位该如何处理,看似可以方向到下一阶段,但是因为有可能一个链表完了但是另一个链表没完,然后就退出循环了。所以,这里最优(如果不这样后面会出一些问题,可能会出现最后一个数字是0的情况)的办法就是续上链表(# 下一阶),续上的值当然为0
  5. 然后什么时候结束呢?那就是再在他们两个的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的值,达到不越链表的界的效果。

目录
相关文章
|
4天前
|
机器学习/深度学习
leetcode代码记录(旋转图像
leetcode代码记录(旋转图像
9 0
|
4天前
|
算法
leetcode代码记录(全排列 II
leetcode代码记录(全排列 II
13 4
|
4天前
|
算法
leetcode代码记录(全排列
leetcode代码记录(全排列
12 1
|
4天前
|
索引
leetcode代码记录(Z 字形变换
leetcode代码记录(Z 字形变换
11 1
|
4天前
leetcode代码记录(最长回文子串
leetcode代码记录(最长回文子串
9 2
|
4天前
leetcode代码记录(回文数
leetcode代码记录(回文数
12 1
|
4天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
13 2
|
4天前
leetcode代码记录(两数之和
leetcode代码记录(两数之和
11 1
|
4天前
|
索引
leetcode代码记录(最长公共子序列
leetcode代码记录(最长公共子序列
7 0
|
4天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
12 0