leetcode rust 合并两个有序链表
时间: 2023-05-04 21:03:15 浏览: 197
本题要求合并两个有序链表。对于链表中的每一个节点,由于链表是有序的,所以可以将两个链表中的节点按照大小顺序进行比较,然后逐个将较小的节点链接上去,最终得到一个新的有序链表。
使用Rust语言实现这个问题,需要首先定义一个链表节点的结构体,包含node值以及next指针。然后定义一个函数来合并两个有序链表,输入为两个链表的头节点指针,输出为新的有序链表的头节点指针。
在合并过程中,首先需要判断两个链表的头节点哪一个较小,将较小的节点作为新链表的头节点,并将该节点的next指针指向递归调用合并函数的结果。递归结束条件为其中一个链表为空,则将另一个链表直接链接到新链表上。
完整代码如下:
```rust
// 定义链表节点结构体
#[derive(Debug)]
struct ListNode {
val: i32,
next: Option<Box<ListNode>>,
}
impl ListNode {
fn new(val: i32) -> Self {
ListNode { val, next: None }
}
}
// 合并两个有序链表
fn merge_two_lists(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
match (l1, l2) {
(None, None) => None, // 两个链表均为空
(l1, None) => l1, // 其中一个链表为空,直接返回另一个链表
(None, l2) => l2,
(Some(mut l1), Some(mut l2)) => {
if l1.val < l2.val {
l1.next = merge_two_lists(l1.next, Some(l2));
Some(l1)
} else {
l2.next = merge_two_lists(Some(l1), l2.next);
Some(l2)
}
}
}
}
// 测试代码
fn main() {
let l1 = Some(Box::new(ListNode {
val: 1,
next: Some(Box::new(ListNode {
val: 2,
next: Some(Box::new(ListNode {
val: 4,
next: None,
})),
})),
}));
let l2 = Some(Box::new(ListNode {
val: 1,
next: Some(Box::new(ListNode {
val: 3,
next: Some(Box::new(ListNode {
val: 4,
next: None,
})),
})),
}));
let merged = merge_two_lists(l1, l2);
println!("{:?}", merged);
}
```