Small refactor for p2 and p21, started implementing p25
This commit is contained in:
parent
0819e90e80
commit
e714a84a6d
3 changed files with 41 additions and 31 deletions
|
@ -2,22 +2,17 @@ use super::linked_list::ListNode;
|
||||||
|
|
||||||
pub struct Solution;
|
pub struct Solution;
|
||||||
impl Solution {
|
impl Solution {
|
||||||
pub fn merge_two_lists(list1: Option<Box<ListNode>>, list2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
|
pub fn merge_two_lists(mut list1: Option<Box<ListNode>>, mut list2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
|
||||||
let mut head = None;
|
let mut head = None;
|
||||||
let mut tail = &mut head;
|
let mut tail = &mut head;
|
||||||
let (mut l1, mut l2) = (&list1, &list2);
|
while list1.is_some() || list2.is_some() {
|
||||||
while l1.is_some() || l2.is_some() {
|
let val1 = list1.as_ref().map_or(i32::MAX, |node| node.val);
|
||||||
let val1 = if l1.is_some() {
|
let val2 = list2.as_ref().map_or(i32::MAX, |node| node.val);
|
||||||
l1.as_ref().unwrap().val
|
|
||||||
} else { i32::MAX };
|
|
||||||
let val2 = if l2.is_some() {
|
|
||||||
l2.as_ref().unwrap().val
|
|
||||||
} else { i32::MAX };
|
|
||||||
let num = if val1 < val2 {
|
let num = if val1 < val2 {
|
||||||
l1 = &l1.as_ref().unwrap().next;
|
list1 = list1.unwrap().next;
|
||||||
val1
|
val1
|
||||||
} else {
|
} else {
|
||||||
l2 = &l2.as_ref().unwrap().next;
|
list2 = list2.unwrap().next;
|
||||||
val2
|
val2
|
||||||
};
|
};
|
||||||
*tail = Some(Box::new(ListNode::new(num)));
|
*tail = Some(Box::new(ListNode::new(num)));
|
||||||
|
|
|
@ -3,7 +3,25 @@ use crate::linked_list::ListNode;
|
||||||
pub struct Solution;
|
pub struct Solution;
|
||||||
impl Solution {
|
impl Solution {
|
||||||
pub fn reverse_k_group(mut head: Option<Box<ListNode>>, k: i32) -> Option<Box<ListNode>> {
|
pub fn reverse_k_group(mut head: Option<Box<ListNode>>, k: i32) -> Option<Box<ListNode>> {
|
||||||
unimplemented!()
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn swap_adjacent(head: &mut Option<Box<ListNode>>) {
|
||||||
|
let next = &mut head.as_mut().unwrap().next;
|
||||||
|
let mut next_node = next.take();
|
||||||
|
head.as_mut().unwrap().next = next_node.as_mut().unwrap().next.take();
|
||||||
|
next_node.as_mut().unwrap().next = head.take();
|
||||||
|
head.replace(next_node.unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reverse_list(mut tail: &mut Option<Box<ListNode>>, length: i32) -> &mut Option<Box<ListNode>> {
|
||||||
|
let head = &mut *tail;
|
||||||
|
for _ in 0..length {
|
||||||
|
if tail.as_mut().unwrap().next.is_none() { break; }
|
||||||
|
Self::swap_adjacent(tail);
|
||||||
|
tail = &mut tail.as_mut().unwrap().next;
|
||||||
|
}
|
||||||
|
todo!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,31 +2,28 @@ use crate::linked_list::ListNode;
|
||||||
|
|
||||||
pub struct Solution;
|
pub struct Solution;
|
||||||
impl Solution {
|
impl Solution {
|
||||||
pub fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
|
pub fn add_two_numbers(mut l1: Option<Box<ListNode>>, mut l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
|
||||||
let (mut l1, mut l2) = (l1, l2);
|
let mut head = None;
|
||||||
let mut head = Box::new(ListNode::new(0));
|
|
||||||
let mut tail = &mut head;
|
let mut tail = &mut head;
|
||||||
loop {
|
let mut carry = 0;
|
||||||
let mut sum = tail.val;
|
while l1.is_some() || l2.is_some() {
|
||||||
if let Some(node) = &l1 {
|
let mut sum = carry;
|
||||||
|
if let Some(mut node) = l1.take() {
|
||||||
sum += node.val;
|
sum += node.val;
|
||||||
l1 = node.next.clone();
|
l1 = node.next.take()
|
||||||
}
|
}
|
||||||
if let Some(node) = &l2 {
|
if let Some(mut node) = l2.take() {
|
||||||
sum += node.val;
|
sum += node.val;
|
||||||
l2 = node.next.clone();
|
l2 = node.next.take()
|
||||||
}
|
}
|
||||||
let next_node = Box::new(ListNode::new(sum / 10));
|
let new_node = Box::new(ListNode::new(sum % 10));
|
||||||
tail.val = sum % 10;
|
carry = sum / 10;
|
||||||
if l1.is_none() && l2.is_none() {
|
*tail = Some(new_node);
|
||||||
if next_node.val > 0 { tail.next = Some(next_node); }
|
tail = &mut tail.as_mut().unwrap().next;
|
||||||
break;
|
|
||||||
}
|
|
||||||
tail.next = Some(next_node);
|
|
||||||
tail = tail.next.as_mut().unwrap();
|
|
||||||
}
|
}
|
||||||
return Some(head);
|
if carry > 0 { *tail = Some(Box::new(ListNode::new(carry))); }
|
||||||
}
|
return head;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Reference in a new issue