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;
}
}
网友评论