[leetcode]LeetCode刷题的日子--Add Two Numbers

指针潮汐
• 阅读 1532

刷题第二天。今天下班其实很早,但是一晚上都在学rust的Option,Some,Box的用法,用来刷题的时间基本都没有了,所以只刷了一道。

题目如下:

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Example:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.

题目翻译:

一个不为空的单链表表示一个非负整数,其中头部位低位,尾部为高位,计算两个数相加的结果。

题目思路:

从头部开始遍历,逐级相加,记得考虑进位

代码如下:

struct ListNode {
    pub val: i32,
    pub next: Option<Box<ListNode>>
}

impl ListNode {
    #[inline]
    fn new(val: i32) -> Self {
        ListNode {
            next: None,
            val
        }
    }
}

fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    let mut ret = Some(Box::new(ListNode::new(0)));

    let (mut p1, mut p2, mut carry) = (l1, l2, 0);
    let mut pos = ret.as_mut();
    while p1.is_some() || p2.is_some() {
        let mut sum = carry;

        if let Some(v) = p1 {
            sum += v.val;
            p1 = v.next;
        }

        if let Some(v) = p2 {
            sum += v.val;
            p2 = v.next;
        }

        if sum >= 10 {
            carry = 1;
            sum = sum - 10;
        } else {
            carry = 0;
        }

        let v = pos.unwrap();
        v.next = Some(Box::new(ListNode::new(sum)));
        pos = v.next.as_mut();
    }

    if carry > 0 {
        let v = pos.unwrap();
        v.next = Some(Box::new(ListNode::new(1)));
    }

    return ret.unwrap().next;
}

#[test]
fn test_add_two_numbers() {
    assert_eq!(1, 1);

    let mut l1 = Box::new(ListNode::new(2));
    l1.next = Some(Box::new(ListNode::new(4)));
    l1.next.as_mut().unwrap().next= Some(Box::new(ListNode::new(7)));

    let mut l2 = Box::new(ListNode::new(5));
    l2.next = Some(Box::new(ListNode::new(6)));
    l2.next.as_mut().unwrap().next = Some(Box::new(ListNode::new(4)));

    let ret = add_two_numbers(Some(l1), Some(l2));

    let expected_ret = [7, 0, 2, 1];
    let mut pos = ret;
    for i in (0..expected_ret.len()) {
        assert_eq!(pos.is_some(), true);
        if !pos.is_some() {
            break;
        }

        if let Some(v) = pos {
            assert_eq!(v.val, expected_ret[i]);
            pos = v.next;
        }

    }
}
点赞
收藏
评论区
推荐文章
一只编程熊 一只编程熊
4年前
ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识结构图首先,了解算法和数据结构有哪些知识点,在学习中形成大局观,对学习和刷题十分有帮助。下面是我花了一天时间整理的算法和数据结构的知识结构,大家可以看看。<imgsrc"https://tva1.sinaimg.cn/large/008i3skNly1gsbvbwd5u1j30ys0u0tl6.jpg"alt"image202107
如何搞定力扣刷题?
好买网(www.goodmai.com)IT技术交易平台前言大家好,我是bigsai,好久不见!今天就给各位小伙伴分享我自己刷题力扣的一些小方法,不一定很有用但是可以参考,祝你更高效的变强!最近在一些群聊、私聊中遇到很多的一个问题就是:刷题,大家也都重视到算法刷题对冲击大厂的重要性,越来越多的人开始卷起来了!BA321C5AFE6864CE60465A0E7
WeiSha100 WeiSha100
3年前
学习刷题培训系统源代码
这是一套完整的学习刷题培训系统源码,经过测试,源码开放,可二次开发,有在线学习,刷题,参与考试,后台学习记录可追踪,可打印学习证明,比较好上手,分享给需要的朋友,需要的话可以下载研究。整体的功能比较完善,做一个线上学习系统来说足够用了1、在线学习:可上传视频,图文资料,习题2、在线直播:可以屏幕共享,电子白板,文字交流,在线培训3、刷题:有可批量管理上传的题
Stella981 Stella981
4年前
Github最强算法刷题笔记.pdf
资料一昨晚逛GitHub,无意中看到一位大佬(https://github.com/halfrost)的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷LeetCode算法题后整理的数百道题,每道题均附有详细题
Stella981 Stella981
4年前
2021金三银四想进字节大厂必看:LeetCode算法收割机+算法刷题宝典
最近有看到很多朋友想进大厂,四面竟然都考了算法,很多同学面对算法的问题都很头大,因为自己做项目很难用到,但是但凡高薪的职位面试都会问到。最近我整理了一份刷题宝典,这份刷题宝典,也让我进了心仪的大厂。今天给大家分享一下:!(https://static001.geekbang.org/infoq/07/074b4c3d563eca9e7f73a
Stella981 Stella981
4年前
Leetcode Index
序:  用于记录刷题过程中难度较大或思路怪异的题目,对于常规难度一般的题就不写入我的博客了,关于效率仅是提交时击败的百分比,可能会随时间波动,仅供参考,算法优劣以时间复杂度和空间复杂度为基准。欢迎留言讨论。题目序号难度效率Leetcode42.TrappingRainWater(https://www.oschina.
可莉 可莉
4年前
2021金三银四想进字节大厂必看:LeetCode算法收割机+算法刷题宝典
最近有看到很多朋友想进大厂,四面竟然都考了算法,很多同学面对算法的问题都很头大,因为自己做项目很难用到,但是但凡高薪的职位面试都会问到。最近我整理了一份刷题宝典,这份刷题宝典,也让我进了心仪的大厂。今天给大家分享一下:!(https://static001.geekbang.org/infoq/07/074b4c3d563eca9e7f73a
Wesley13 Wesley13
4年前
LeetCode刷题实战61:旋转链表
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选!今天和大家聊的问题叫做旋转链表,我们先来看题面:https://leetcodecn.com/problems/rotatelist/Give
WeiSha100 WeiSha100
3年前
基于.NET的在线刷题考试系统源代码
分享一个基于.NET的在线刷题考试系统,有完整的源代码和脚本文件,可以做二次开发,有管理员,教师和学生三种角色,教师后台可以批量上传试题,发布试卷,批改试卷,统计导出成绩等功能很全面,除了在线刷题和考试,还有其他功能,我在这里简单说一下,详细的可以下载研究哦1、在线刷题:试题可以批量导入导出,学员可以随时随地刷题2、在线考试:多种考试模式,客观题自动阅卷,
WeiSha100 WeiSha100
3年前
C#在线学习平台源代码
分享一个C.NET的在线学习平台,有源代码和开发文档,可以做二次开发,可以在线点播,直播,刷题,在线考试测试,统计管理,教师后台可以批量上传试题,发布试卷,批改试卷,统计导出成绩等简单介绍一下这个平台的一些功能,详细的可以自行下载了解哦1、在线刷题:试题可以批量导入导出,学员可以随时随地刷题2、在线考试:多种考试模式,客观题自动阅卷,主观题人工阅卷3、视频
WeiSha100 WeiSha100
3年前
C#.NE在线考试开发文件和源代码
内容介绍:分享一个C.NET的在线考试系统,有开发文档和源代码,可以做二次开发,可以在线点播,直播,刷题,在线考试测试,统计管理,教师后台可以批量上传试题,发布试卷,批改试卷,统计导出成绩等简单介绍一下这个平台的一些功能,详细的可以自行下载了解哦1、在线刷题:试题可以批量导入导出,学员可以随时随地刷题2、在线考试:多种考试模式,客观题自动阅卷,主观题人工