Skip to content

Commit bf19a16

Browse files
author
build
committed
feat:update
1 parent a6234d3 commit bf19a16

File tree

1 file changed

+89
-57
lines changed

1 file changed

+89
-57
lines changed

exercises/algorithm/algorithm1.rs

Lines changed: 89 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
/*
2-
single linked list merge
3-
This problem requires you to merge two ordered singly linked lists into one ordered singly linked list
2+
single linked list merge
3+
This problem requires you to merge two ordered singly linked lists into one ordered singly linked list
44
*/
5-
// I AM NOT DONE
6-
75
use std::fmt::{self, Display, Formatter};
86
use std::ptr::NonNull;
97
use std::vec::*;
@@ -16,10 +14,7 @@ struct Node<T> {
1614

1715
impl<T> Node<T> {
1816
fn new(t: T) -> Node<T> {
19-
Node {
20-
val: t,
21-
next: None,
22-
}
17+
Node { val: t, next: None }
2318
}
2419
}
2520
#[derive(Debug)]
@@ -69,15 +64,52 @@ impl<T> LinkedList<T> {
6964
},
7065
}
7166
}
72-
pub fn merge(list_a:LinkedList<T>,list_b:LinkedList<T>) -> Self
73-
{
74-
//TODO
75-
Self {
76-
length: 0,
77-
start: None,
78-
end: None,
67+
pub fn merge(list_a: LinkedList<T>, list_b: LinkedList<T>) -> Self
68+
where
69+
T: PartialOrd + Copy,
70+
{
71+
let mut merged_list = LinkedList::new();
72+
73+
unsafe {
74+
let mut ptr_a = list_a.start;
75+
let mut ptr_b = list_b.start;
76+
77+
while ptr_a.is_some() && ptr_b.is_some() {
78+
let val_a = &(*ptr_a.unwrap().as_ptr()).val;
79+
let val_b = &(*ptr_b.unwrap().as_ptr()).val;
80+
if val_a > val_b {
81+
merged_list.add((*val_b).clone());
82+
ptr_b = (*ptr_b.unwrap().as_ptr()).next;
83+
} else {
84+
merged_list.add((*val_a).clone());
85+
ptr_a = (*ptr_a.unwrap().as_ptr()).next;
86+
}
87+
}
88+
89+
while ptr_a.is_some() {
90+
let val_a = &(*ptr_a.unwrap().as_ptr()).val;
91+
merged_list.add((*val_a).clone());
92+
ptr_a = (*ptr_a.unwrap().as_ptr()).next;
93+
}
94+
95+
while ptr_b.is_some() {
96+
let val_b = &(*ptr_b.unwrap().as_ptr()).val;
97+
merged_list.add((*val_b).clone());
98+
ptr_b = (*ptr_b.unwrap().as_ptr()).next;
99+
}
100+
}
101+
102+
merged_list
103+
}
104+
105+
fn add_node(&mut self, node_ptr: NonNull<Node<T>>) {
106+
match self.end {
107+
None => self.start = Some(node_ptr),
108+
Some(end_ptr) => unsafe { (*end_ptr.as_ptr()).next = Some(node_ptr) },
79109
}
80-
}
110+
self.end = Some(node_ptr);
111+
self.length += 1;
112+
}
81113
}
82114

83115
impl<T> Display for LinkedList<T>
@@ -130,44 +162,44 @@ mod tests {
130162

131163
#[test]
132164
fn test_merge_linked_list_1() {
133-
let mut list_a = LinkedList::<i32>::new();
134-
let mut list_b = LinkedList::<i32>::new();
135-
let vec_a = vec![1,3,5,7];
136-
let vec_b = vec![2,4,6,8];
137-
let target_vec = vec![1,2,3,4,5,6,7,8];
138-
139-
for i in 0..vec_a.len(){
140-
list_a.add(vec_a[i]);
141-
}
142-
for i in 0..vec_b.len(){
143-
list_b.add(vec_b[i]);
144-
}
145-
println!("list a {} list b {}", list_a,list_b);
146-
let mut list_c = LinkedList::<i32>::merge(list_a,list_b);
147-
println!("merged List is {}", list_c);
148-
for i in 0..target_vec.len(){
149-
assert_eq!(target_vec[i],*list_c.get(i as i32).unwrap());
150-
}
151-
}
152-
#[test]
153-
fn test_merge_linked_list_2() {
154-
let mut list_a = LinkedList::<i32>::new();
155-
let mut list_b = LinkedList::<i32>::new();
156-
let vec_a = vec![11,33,44,88,89,90,100];
157-
let vec_b = vec![1,22,30,45];
158-
let target_vec = vec![1,11,22,30,33,44,45,88,89,90,100];
159-
160-
for i in 0..vec_a.len(){
161-
list_a.add(vec_a[i]);
162-
}
163-
for i in 0..vec_b.len(){
164-
list_b.add(vec_b[i]);
165-
}
166-
println!("list a {} list b {}", list_a,list_b);
167-
let mut list_c = LinkedList::<i32>::merge(list_a,list_b);
168-
println!("merged List is {}", list_c);
169-
for i in 0..target_vec.len(){
170-
assert_eq!(target_vec[i],*list_c.get(i as i32).unwrap());
171-
}
172-
}
173-
}
165+
let mut list_a = LinkedList::<i32>::new();
166+
let mut list_b = LinkedList::<i32>::new();
167+
let vec_a = vec![1, 3, 5, 7];
168+
let vec_b = vec![2, 4, 6, 8];
169+
let target_vec = vec![1, 2, 3, 4, 5, 6, 7, 8];
170+
171+
for i in 0..vec_a.len() {
172+
list_a.add(vec_a[i]);
173+
}
174+
for i in 0..vec_b.len() {
175+
list_b.add(vec_b[i]);
176+
}
177+
println!("list a {} list b {}", list_a, list_b);
178+
let mut list_c = LinkedList::<i32>::merge(list_a, list_b);
179+
println!("merged List is {}", list_c);
180+
for i in 0..target_vec.len() {
181+
assert_eq!(target_vec[i], *list_c.get(i as i32).unwrap());
182+
}
183+
}
184+
#[test]
185+
fn test_merge_linked_list_2() {
186+
let mut list_a = LinkedList::<i32>::new();
187+
let mut list_b = LinkedList::<i32>::new();
188+
let vec_a = vec![11, 33, 44, 88, 89, 90, 100];
189+
let vec_b = vec![1, 22, 30, 45];
190+
let target_vec = vec![1, 11, 22, 30, 33, 44, 45, 88, 89, 90, 100];
191+
192+
for i in 0..vec_a.len() {
193+
list_a.add(vec_a[i]);
194+
}
195+
for i in 0..vec_b.len() {
196+
list_b.add(vec_b[i]);
197+
}
198+
println!("list a {} list b {}", list_a, list_b);
199+
let mut list_c = LinkedList::<i32>::merge(list_a, list_b);
200+
println!("merged List is {}", list_c);
201+
for i in 0..target_vec.len() {
202+
assert_eq!(target_vec[i], *list_c.get(i as i32).unwrap());
203+
}
204+
}
205+
}

0 commit comments

Comments
 (0)