package me.ramswaroop.linkedlists; import me.ramswaroop.common.SingleLinkedList; import me.ramswaroop.common.SingleLinkedNode; /** * Created by IntelliJ IDEA. * * @author: ramswaroop * @date: 6/27/15 * @time: 8:47 PM */ public class MergeTwoSortedLists { /** * Merges two sorted list {@param list1} and {@param list2} into * a list with values in ascending order. * * @param list1 * @param list2 * @param <E> * @return */ public static <E extends Comparable<E>> SingleLinkedList<E> mergeTwoSortedLists(SingleLinkedList<E> list1, SingleLinkedList<E> list2) { SingleLinkedNode<E> curr1 = list1.head, curr2 = list2.head; SingleLinkedList<E> intersectedList = new SingleLinkedList<>(); while (curr1 != null || curr2 != null) { // handle cases where either of the list run out first if (curr1 == null) { intersectedList.add(curr2.item); curr2 = curr2.next; } else if (curr2 == null) { intersectedList.add(curr1.item); curr1 = curr1.next; } else if (curr1.item.compareTo(curr2.item) < 0) { // advance the current pointer of // the list having smaller {@code item} intersectedList.add(curr1.item); curr1 = curr1.next; } else if (curr1.item.compareTo(curr2.item) > 0) { intersectedList.add(curr2.item); curr2 = curr2.next; } else { // both nodes are equal so add both to the result intersectedList.add(curr1.item); intersectedList.add(curr1.item); curr1 = curr1.next; curr2 = curr2.next; } } return intersectedList; } /** * Recursive method to merge two sorted lists into one sorted list. * <p/> * NOTE: You can make {@param mergedList} as static and not pass as params * to this method. * * @param node1 * @param node2 * @param <E> */ public static <E extends Comparable<E>> SingleLinkedNode<E> mergeTwoSortedLists(SingleLinkedList<E> mergedList, SingleLinkedNode<E> node1, SingleLinkedNode<E> node2) { if (node1 == null && node2 == null) return null; // if either of the list runs out first if (node1 == null) { mergeTwoSortedLists(mergedList, node1, node2.next); mergedList.addFirst(node2.item); return node2; } if (node2 == null) { mergeTwoSortedLists(mergedList, node1.next, node2); mergedList.addFirst(node1.item); return node1; } if (node1.item.compareTo(node2.item) < 0) { // node1 is smaller, so add it and advance the pointer mergeTwoSortedLists(mergedList, node1.next, node2); mergedList.addFirst(node1.item); return node1; } else if (node1.item.compareTo(node2.item) > 0) { mergeTwoSortedLists(mergedList, node1, node2.next); mergedList.addFirst(node2.item); return node2; } else { // both nodes are equal so add both mergeTwoSortedLists(mergedList, node1.next, node2.next); mergedList.addFirst(node1.item); mergedList.addFirst(node2.item); return node1; } } public static void main(String a[]) { SingleLinkedList<Integer> linkedList1 = new SingleLinkedList<>(); linkedList1.add(00); linkedList1.add(11); linkedList1.add(22); linkedList1.add(33); linkedList1.add(44); linkedList1.add(55); linkedList1.printList(); SingleLinkedList<Integer> linkedList2 = new SingleLinkedList<>(); linkedList2.add(21); linkedList2.add(33); linkedList2.add(44); linkedList2.add(55); linkedList2.add(67); linkedList2.add(89); linkedList2.add(99); linkedList2.printList(); mergeTwoSortedLists(linkedList1, linkedList2).printList(); System.out.println("===================="); linkedList1.printList(); linkedList2.printList(); SingleLinkedList<Integer> mergedList = new SingleLinkedList<>(); mergeTwoSortedLists(mergedList, linkedList1.head, linkedList2.head); mergedList.printList(); } }