package DataStructures.Lists;

public class MergeSortedSinglyLinkedList extends SinglyLinkedList {

  public static void main(String[] args) {
    SinglyLinkedList listA = new SinglyLinkedList();
    SinglyLinkedList listB = new SinglyLinkedList();

    for (int i = 2; i <= 10; i += 2) {
      listA.insert(i);
      listB.insert(i - 1);
    }
    assert listA.toString().equals("2->4->6->8->10");
    assert listB.toString().equals("1->3->5->7->9");
    assert merge(listA, listB).toString().equals("1->2->3->4->5->6->7->8->9->10");
  }

  /**
   * Merge two sorted SingleLinkedList
   *
   * @param listA the first sorted list
   * @param listB the second sored list
   * @return merged sorted list
   */
  public static SinglyLinkedList merge(SinglyLinkedList listA, SinglyLinkedList listB) {
    Node headA = listA.getHead();
    Node headB = listB.getHead();

    int size = listA.size() + listB.size();

    Node head = new Node();
    Node tail = head;
    while (headA != null && headB != null) {
      if (headA.value <= headB.value) {
        tail.next = headA;
        headA = headA.next;
      } else {
        tail.next = headB;
        headB = headB.next;
      }
      tail = tail.next;
    }
    if (headA == null) {
      tail.next = headB;
    }
    if (headB == null) {
      tail.next = headA;
    }
    return new SinglyLinkedList(head.next, size);
  }
}

MergeSortedSinglyLinkedList