public static <T> node_t<T> zipping_linked_list(node_t<T> L) {
    node_t<T> slow = L, fast = L, pre_slow = null;

    // Find the middle point of L.
    while (fast != null) {
      fast = fast.next;
      if (fast != null) {
        pre_slow = slow;
        fast = fast.next; slow = slow.next;
      }
    }

    if (pre_slow == null) {
      return L;  // only contains one node in the list.
    }
    pre_slow.next = null;  // splits the list into two lists.
    node_t<T> reverse =
            ReverseLinkedListIterativeTemplate.reverse_linked_list(slow);
    node_t<T> curr = L;

    // Zipping the list.
    while (curr != null && reverse != null) {
      node_t<T> temp = curr.next;
      curr.next = reverse;
      curr = temp;
      // Connect curr->next to reverse, and advance curr.
      //connect_a_next_to_b_advance_a(ref_curr, reverse);
      if (curr != null) {
        // Connect reverse->next to curr, and advance reverse.
        node_t<T> temp2 = reverse.next;
        reverse.next = curr;
        reverse = temp2;
        //connect_a_next_to_b_advance_a(ref_reverse, curr);
      }
    }

    return L;
  }