美文网首页
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

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