I wrote the following code to merge two sorted lists. Is there a way I can improve it?
Possible ideas (not sure how to implement them):
- Remove code duplication (setting the returning list node and moving to the next)
- Avoid the use of the infinite
loop - Avoid the use of
panic!
This is the data structure:
type Link = Option<Box<Node>>;
pub struct Node {
elem: i32,
next: Link,
}
impl Node {
fn new(elem: i32) -> Node {
Node { elem, next: None }
}
}
And this is the method:
fn merge_sorted_lists(list1: &Link, list2: &Link) -> Link {
if list1.is_none() || list2.is_none() {
return None;
}
let mut res = None;
{
let mut node3 = &mut res;
let mut node1 = list1;
let mut node2 = list2;
loop {
if let (Some(link1), Some(link2)) = (node1, node2) {
if link1.elem > link2.elem {
*node3 = Some(Box::new(Node::new(link2.elem)));
node2 = &link2.next;
} else {
*node3 = Some(Box::new(Node::new(link1.elem)));
node1 = &link1.next;
}
if let Some(link) = {node3} {
node3 = &mut link.next;
} else {
panic!();
}
} else if let Some(link1) = node1 {
*node3 = Some(Box::new(Node::new(link1.elem)));
node1 = &link1.next;
if let Some(link) = {node3} {
node3 = &mut link.next;
} else {
panic!();
}
} else if let Some(link2) = node2 {
*node3 = Some(Box::new(Node::new(link2.elem)));
node1 = &link2.next;
if let Some(link) = {node3} {
node3 = &mut link.next;
} else {
panic!();
}
} else {
break;
}
}
}
res
}