讨论社区

21题,使用Rust语言,相同的代码,用例执行失败,在playground上执行OK,求解。

代码如下,比较挫,凑活看。

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

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

fn array_to_list(array: Vec<i32>) -> Option<Box<ListNode>> {
    let mut tail = None;
    for i in 0..array.len() {
        let node = ListNode { val: array[i], next: tail };
        tail = Some(Box::new(node));
    }
    tail
}

#[allow(dead_code)]
fn show(list: Option<Box<ListNode>>) {
    let mut node = list;
    while let Some(inner) = node {
        print!("[{}] ", inner.val);
        node = inner.next;
    }
    println!(" ");
}

fn merge_two_lists(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    fn reserve(list: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        let mut tail = None;
        let mut node = list;
        while let Some(inner) = node {
            let p = ListNode { val: inner.val, next: tail };
            tail = Some(Box::new(p));
            node = inner.next;
        }
        tail
    }
    let mut tail = None;
    let mut node1 = reserve(l1);
    let mut node2 = reserve(l2);
    loop {
        match (node1.clone(), node2.clone()) {
            (Some(inner1), Some(inner2)) => {
                if inner1.val <= inner2.val {
                    let p1 = ListNode { val: inner1.val, next: tail };
                    tail = Some(Box::new(p1));
                    node1 = inner1.next;
                } else {
                    let p2 = ListNode { val: inner2.val, next: tail };
                    tail = Some(Box::new(p2));
                    node2 = inner2.next;
                }
            }
            (Some(inner1), None) => {
                let node = ListNode { val: inner1.val, next: tail };
                tail = Some(Box::new(node));
                node1 = inner1.next;
            }
            (None, Some(inner2)) => {
                let node = ListNode { val: inner2.val, next: tail };
                tail = Some(Box::new(node));
                node2 = inner2.next;
            }
            (None, None) => { break; }
        }
    }
    tail
}

fn main() {
    println!("Hello, World!");
    let aa = array_to_list(vec![1, 2, 4]);
    let bb = array_to_list(vec![1, 3, 4]);
    // show(merge_two_lists(aa, bb));
    assert_eq!(merge_two_lists(aa, bb), array_to_list(vec![1, 1, 2, 3, 4, 4]));
}

本地执行的结果和playground上执行OK,都是[1,1,2,3,4,4]。

提交后显示输出结果是[1,3,4,1,2,4]。


0 人关注了该问题 关注

您需要登录后才可以回复