美文网首页
LeetCode 两数相加 Rust

LeetCode 两数相加 Rust

作者: liaozhiyuan | 来源:发表于2019-10-13 01:19 被阅读0次

LeetCode 两数相加 Rust

题目

给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

  • 在Rust代码中主要考虑Option的操作,对Option的引用或者Move。Rust中任何资源都是有持有者的,也就是ownership。
    在本例中Option持有了他内部的None或者Some(x),一旦解开这个Option,那么Option结构就会在scope结束后被释放。
    针对这种情况Rust提供了as_mut, as_ref两个接口来获取Option内部资源的引用。从而避免解开Option包裹后发生所有权转移。

  • Rust中不是使用* int 类型申明指针,而是使用 let x: &i32 = &y 这样的形式申明指针。

  • 对指针的解引用概念与C/C++是一致的,用法类似二级指针。
    本例中let mut cur = &mut head.next;cur是一个指向head.next的指针,对cur进行解引用,则代表对head.next赋值。
    对cur进行赋值后,则可以正常的移动指针,即:cur = &mut cur.as_mut().unwrap().next;

  • 代码中有重复内容,使用函数闭包来封装处理过程,是较为简洁的做法。


#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
    pub val: i32,
    pub next: Option<Box<ListNode>>,
}

impl ListNode {
    #[inline]
    fn new(val: i32) -> Self {
        ListNode { next: None, val }
    }
}
struct Solution;
impl Solution {
    pub fn add_two_numbers(
        l1: Option<Box<ListNode>>,
        l2: Option<Box<ListNode>>,
    ) -> Option<Box<ListNode>> {

        let mut head = ListNode::new(0);
        let mut cur = &mut head.next;
        let (mut x, mut y) = (l1, l2);
        let mut upper = 0;
        let node_val = |node: &Option<Box<ListNode>>| node.as_ref().map_or(0, |x| x.val);
        let node_next = |node: Option<Box<ListNode>>| node.map_or(None, |node| node.next);
        while x.is_some() || y.is_some() || upper == 1 {
            let sum = node_val(&x) + node_val(&y) + upper;
            upper = 0;
            if sum >= 10 {
                upper = 1;
            }
            let node = ListNode::new(sum % 10);
            *cur = Some(Box::new(node));
            cur = &mut cur.as_mut().unwrap().next;
            x = node_next(x);
            y = node_next(y);
        }
        return head.next;
    }
}

相关文章

  • LeetCode 两数相加 Rust

    LeetCode 两数相加 Rust 题目 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 ...

  • 两数相加 - Rust

    因为是逆序,可以正常的每一个位置对应相加,如果位数不一致,那么缺少的那一个位值为0即可,对应的进位数往前加。 ru...

  • LeetCode-454-四数相加 II

    LeetCode-454-四数相加 II 454. 四数相加 II[https://leetcode-cn.com...

  • leetcode两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表...

  • [LeetCode] 两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表...

  • leetcode 两数相加

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...

  • LeetCode 两数相加

    感觉这题就是在帮我跳出大数相加的坑这是我自己的答案,在long范围内都是对的,但是数字超过取值范围的时候就崩溃了,...

  • 两数相加【LeetCode】

    题目: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每...

  • LeetCode——两数相加

    题目描述 一、CPP链表遍历相加 解题思路:思路很简单,就是一起遍历两个链表,把其值加起来,使用尾插法插入一个新的...

  • 两数相加--LeetCode

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...

网友评论

      本文标题:LeetCode 两数相加 Rust

      本文链接:https://www.haomeiwen.com/subject/urqhmctx.html