Leetcode---2.两数之和

简介: 基本算法

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
image.png

分析

简单看了一下这道题直接开始解题,我的思路其实也简单,遍历两个列表,使相同位数对应的两个数相加如果大于10就进一,如果小于10直接保留,只用把长度小的数组遍历完即可,但要考虑最后一个数是否大于10,
class Solution:

def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
    l1_length=len(l1)
    l2_length=len(l2)
    l3=[]
    num = min(l1_length, l2_length)
    flag=0
    for i in range(0,num):
        s=l1[i]+l2[i]+flag
        if s-10>=0:
            flag=1
            s=s-10
            l3.append(s)
            continue
        flag=0
        l3.append(s)
    if num==l1_length and num==l2_length:
        return l3
    if num==l1_length:
        for i in l2[num:l2_length]:
            if flag!=0:
                l3.append(i+flag)
                flag=0
            l3.append(i)
    # print(l2[num-1:])
    if num==l2_length:
        for i in l1[num:]:
            if flag != 0:
                l3.append(i + flag)
                flag = 0
            l3.append(i)

    return l3

设置的flag就是一个标志看两个数相加是否大于10,又信誓旦旦的去提交,结果直接报错
image.png
结果再次一看发现审题错误,题目中说的是链表,因此我们首先要认识链表,

链表

链表即是线性表的一种,线性表的链式表示,

链式存储结构特点:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以连续,也可以不连续)。
单链表可由头指针唯一确定,头指针指向链表中第一个结点。
首元结点是存储第一个元素的结点。
若要访问数据元素ai,须从头指针出发,顺着指针域逐个结点访问,直至第i个结点。
因此,线性表的链式存储结构只适合顺序访问,不支持直接访问。
image.png

最终代码内含注释

注释版

class Solution:

def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:

    # 定义头节点,val赋值为0
    head_node = ListNode(0)
    node = head_node

    # 进位标识符carry,初值为0
    carry = 0

    # while循环,对两链表对应位和上一位产生的进位carry进行相加操作,并判断是否产生了进位,记录carry值
    while l1 !=None or l2 != None:
        l1_num = l1.val if l1 != None else 0
        l2_num = l2.val if l2 != None else 0
        num = (l1_num + l2_num + carry)%10
        carry = 1 if l1_num + l2_num + carry>= 10 else 0  # 判断是否产生进位
        node.next = ListNode(num)  # 在链表尾部添加本次循环所得节点
        node = node.next
        l1 = l1.next if l1 !=None else None  # l1指向下一节点
        l2 = l2.next if l2 !=None else None  # l2指向下一节点

    # 循环后若最高位产生了进位则在链表尾部添加一个val为1的节点
    if carry == 1:
        node.next = ListNode(1)

    # 最后结果舍弃头节点
    head_node = head_node.next
    return head_node


相关文章
|
2月前
|
算法
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
|
2月前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
17天前
|
存储 算法 索引
力扣经典150题第四十三题:两数之和
力扣经典150题第四十三题:两数之和
11 1
|
17天前
|
算法 测试技术 程序员
力扣经典150题第二十七题:两数之和 II - 输入有序数组
力扣经典150题第二十七题:两数之和 II - 输入有序数组
12 1
|
20天前
力扣-两数之和
力扣-两数之和
8 1
|
1月前
|
算法 数据挖掘 Java
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
|
1月前
|
存储 算法 Java
【经典算法】LeetCode1:两数之和(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode1:两数之和(Java/C/Python3实现含注释说明,Easy)
14 1
|
1月前
【LeetCode刷题】两数之和、两数相加
【LeetCode刷题】两数之和、两数相加
|
1月前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
1月前
|
存储 SQL 数据挖掘
LeetCode 第一题:两数之和 【1/1000 python】
LeetCode 第一题:两数之和 【1/1000 python】