Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. impl Solution {
  2. unsafe fn merge2(
  3. lists: &mut Vec<Option<Box<ListNode>>>,
  4. s: usize,
  5. e: usize,
  6. ) -> Option<Box<ListNode>> {
  7. use std::mem::{forget, transmute, uninitialized};
  8. use std::ptr::write;
  9.  
  10. if s == e {
  11. return lists[s].take();
  12. } else {
  13. let mid = (s + e) / 2;
  14. let mut lhs: *mut ListNode = transmute(Solution::merge2(lists, s, mid));
  15. let mut rhs: *mut ListNode = transmute(Solution::merge2(lists, mid + 1, e));
  16. let mut head = uninitialized();
  17. let mut tail: *mut ListNode = &mut head;
  18.  
  19. unsafe fn transfer(dst: &mut *mut ListNode, src: &mut *mut ListNode) {
  20. write(&mut (**dst).next, transmute(*src));
  21. *dst = *src;
  22. *src = transmute((*src).read().next);
  23. }
  24.  
  25. while !lhs.is_null() && !rhs.is_null() {
  26. if (*lhs).val <= (*rhs).val {
  27. transfer(&mut tail, &mut lhs);
  28. } else {
  29. transfer(&mut tail, &mut rhs);
  30. }
  31. }
  32. if !lhs.is_null() {
  33. write(&mut (*tail).next, transmute(lhs));
  34. } else {
  35. write(&mut (*tail).next, transmute(rhs));
  36. }
  37. let ans = (&head.next as *const Option<Box<ListNode>>).read();
  38. forget(head);
  39. ans
  40. }
  41. }
  42.  
  43. pub fn merge_k_lists(mut lists: Vec<Option<Box<ListNode>>>) -> Option<Box<ListNode>> {
  44. if lists.is_empty() {
  45. None
  46. } else {
  47. let (s, e) = (0, lists.len() - 1);
  48. unsafe { Solution::merge2(&mut lists, s, e) }
  49. }
  50. }
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement