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-
75use std:: fmt:: { self , Display , Formatter } ;
86use std:: ptr:: NonNull ;
97use std:: vec:: * ;
@@ -16,10 +14,7 @@ struct Node<T> {
1614
1715impl < 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
83115impl < 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