LeetCode 两数相加 Rust

2019-10-13  本文已影响0人  liaozhiyuan

LeetCode 两数相加 Rust

题目

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


#[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;
    }
}

上一篇下一篇

猜你喜欢

热点阅读