import java.io.*; import java.math.*; import java.security.*; import java.text.*; import java.util.*; import java.util.concurrent.*; import java.util.regex.*; public class Solution { static class SinglyLinkedListNode { public int data; public SinglyLinkedListNode next; public SinglyLinkedListNode(int nodeData) { this.data = nodeData; this.next = null; } } static class SinglyLinkedList { public SinglyLinkedListNode head; public SinglyLinkedListNode tail; public SinglyLinkedList() { this.head = null; this.tail = null; } public void insertNode(int nodeData) { SinglyLinkedListNode node = new SinglyLinkedListNode(nodeData); if (this.head == null) { this.head = node; } else { this.tail.next = node; } this.tail = node; } } public static void printSinglyLinkedList(SinglyLinkedListNode node, String sep, BufferedWriter bufferedWriter) throws IOException { while (node != null) { bufferedWriter.write(String.valueOf(node.data)); node = node.next; if (node != null) { bufferedWriter.write(sep); } } } // Complete the findMergeNode function below. /* * For your reference: * * SinglyLinkedListNode { int data; SinglyLinkedListNode next; } * */ // https://stackoverflow.com/questions/1594061/check-if-two-linked-lists-merge-if-so-where/14956113#14956113 static int FindMergeNode(SinglyLinkedListNode headA, SinglyLinkedListNode headB) { SinglyLinkedListNode currentA = headA; SinglyLinkedListNode currentB = headB; // Do till the two nodes are the same while (currentA != currentB) { // If you reached the end of one list start at the beginning of the other one // currentA if (currentA.next == null) { currentA = headB; } else { currentA = currentA.next; } // currentB if (currentB.next == null) { currentB = headA; } else { currentB = currentB.next; } } return currentB.data; } private static final Scanner scanner = new Scanner(System.in); public static void main(String[] args) throws IOException { BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH"))); int tests = scanner.nextInt(); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); for (int testsItr = 0; testsItr < tests; testsItr++) { int index = scanner.nextInt(); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); SinglyLinkedList llist1 = new SinglyLinkedList(); int llist1Count = scanner.nextInt(); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); for (int i = 0; i < llist1Count; i++) { int llist1Item = scanner.nextInt(); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); llist1.insertNode(llist1Item); } SinglyLinkedList llist2 = new SinglyLinkedList(); int llist2Count = scanner.nextInt(); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); for (int i = 0; i < llist2Count; i++) { int llist2Item = scanner.nextInt(); scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?"); llist2.insertNode(llist2Item); } SinglyLinkedListNode ptr1 = llist1.head; SinglyLinkedListNode ptr2 = llist2.head; for (int i = 0; i < llist1Count; i++) { if (i < index) { ptr1 = ptr1.next; } } for (int i = 0; i < llist2Count; i++) { if (i != llist2Count - 1) { ptr2 = ptr2.next; } } ptr2.next = ptr1; int result = findMergeNode(llist1.head, llist2.head); bufferedWriter.write(String.valueOf(result)); bufferedWriter.newLine(); } bufferedWriter.close(); scanner.close(); } }