Если ваши последовательности отсортированы, вы можете использовать такую функцию:
fn combine(first: &[u32], second:&[u32])->Vec<u32>{
if first.is_empty(){
return second.to_vec();
}
if second.is_empty(){
return first.to_vec();
}
// I will assume that both sorted
let mut first_counted: Vec<(u32, usize)> = Vec::with_capacity(first.len());
for &item in first.iter(){
match first_counted.last_mut(){
Some(last) if last.0 == item =>{
last.1 += 1;
},
_ => first_counted.push((item, 1)),
};
}
let mut second_counted: Vec<(u32, usize)> = Vec::with_capacity(second.len());
for &item in second.iter(){
match second_counted.last_mut(){
Some(last) if last.0 == item => {
last.1 += 1;
},
_ => second_counted.push((item, 1)),
};
}
let mut res = Vec::with_capacity(std::cmp::max(first.len(),second.len()));
let mut fidx = 0;
let mut sidx = 0;
while fidx < first_counted.len() && sidx < second_counted.len(){
let f = &first_counted[fidx];
let s = &second_counted[sidx];
match f.0.cmp(&s.0){
std::cmp::Ordering::Less=>{
res.resize(res.len()+f.1, f.0);
fidx+=1;
},
std::cmp::Ordering::Equal=>{
res.resize(res.len()+std::cmp::max(f.1, s.1), f.0);
fidx+=1;
sidx+=1;
},
std::cmp::Ordering::Greater=>{
res.resize(res.len()+s.1, s.0);
sidx+=1;
},
}
}
res
}
fn main() {
assert_eq!(combine(&[1, 2, 3], &[2, 2, 3]), vec![1,2,2,3]);
}