Hacekrrank Merge two sorted linked lists problem solution YASH PAL, 31 July 2024 In this HackerRank Merge two sorted linked lists problem if we have given pointers of two sorted linked lists, then we need to merge them into a single sorted linked list. and if the pointer is null then it means the list is empty. Problem solution in Python programming. #!/bin/python3 import math import os import random import re import sys class SinglyLinkedListNode: def __init__(self, node_data): self.data = node_data self.next = None class SinglyLinkedList: def __init__(self): self.head = None self.tail = None def insert_node(self, node_data): node = SinglyLinkedListNode(node_data) if not self.head: self.head = node else: self.tail.next = node self.tail = node def print_singly_linked_list(node, sep, fptr): while node: fptr.write(str(node.data)) node = node.next if node: fptr.write(sep) def mergeLists(headA, headB): if headA == None: return headB if headB == None: return headA if headA.data <= headB.data: head = headA headA = headA.next else: head = headB headB = headB.next current = head while headA != None or headB != None: if headA == None: current.next = headB break if headB == None: current.next = headA break if headA.data <= headB.data: current.next = headA headA = headA.next else: current.next = headB headB = headB.next current = current.next return head if __name__ == '__main__': fptr = open(os.environ['OUTPUT_PATH'], 'w') tests = int(input()) for tests_itr in range(tests): llist1_count = int(input()) llist1 = SinglyLinkedList() for _ in range(llist1_count): llist1_item = int(input()) llist1.insert_node(llist1_item) llist2_count = int(input()) llist2 = SinglyLinkedList() for _ in range(llist2_count): llist2_item = int(input()) llist2.insert_node(llist2_item) llist3 = mergeLists(llist1.head, llist2.head) print_singly_linked_list(llist3, ' ', fptr) fptr.write('n') fptr.close() Problem solution in Java Programming. 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); } } } static SinglyLinkedListNode mergeLists(SinglyLinkedListNode head1, SinglyLinkedListNode head2) { if(head1==null) { return head2; } if(head2 == null) { return head1; } SinglyLinkedListNode t1 = head1, t2 = head2; SinglyLinkedListNode head = null, tail = null; if(t1.data<=t2.data) { head = t1; tail = t1; t1= t1.next; } else { head = t2; tail = t2; t2 = t2.next; } while(t1!=null && t2!=null) { if(t1.data<=t2.data) { tail.next = t1; tail = t1; t1 = t1.next; } else { tail.next = t2; tail = t2; t2 = t2.next; } } if(t1!=null) { tail.next = t1; } else { tail.next = t2; } return head; } 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("(rn|[nru2028u2029u0085])?"); for (int testsItr = 0; testsItr < tests; testsItr++) { SinglyLinkedList llist1 = new SinglyLinkedList(); int llist1Count = scanner.nextInt(); scanner.skip("(rn|[nru2028u2029u0085])?"); for (int i = 0; i < llist1Count; i++) { int llist1Item = scanner.nextInt(); scanner.skip("(rn|[nru2028u2029u0085])?"); llist1.insertNode(llist1Item); } SinglyLinkedList llist2 = new SinglyLinkedList(); int llist2Count = scanner.nextInt(); scanner.skip("(rn|[nru2028u2029u0085])?"); for (int i = 0; i < llist2Count; i++) { int llist2Item = scanner.nextInt(); scanner.skip("(rn|[nru2028u2029u0085])?"); llist2.insertNode(llist2Item); } SinglyLinkedListNode llist3 = mergeLists(llist1.head, llist2.head); printSinglyLinkedList(llist3, " ", bufferedWriter); bufferedWriter.newLine(); } bufferedWriter.close(); scanner.close(); } } Problem solution in C++ programming. #include <bits/stdc++.h> using namespace std; class SinglyLinkedListNode { public: int data; SinglyLinkedListNode *next; SinglyLinkedListNode(int node_data) { this->data = node_data; this->next = nullptr; } }; class SinglyLinkedList { public: SinglyLinkedListNode *head; SinglyLinkedListNode *tail; SinglyLinkedList() { this->head = nullptr; this->tail = nullptr; } void insert_node(int node_data) { SinglyLinkedListNode* node = new SinglyLinkedListNode(node_data); if (!this->head) { this->head = node; } else { this->tail->next = node; } this->tail = node; } }; void print_singly_linked_list(SinglyLinkedListNode* node, string sep, ofstream& fout) { while (node) { fout << node->data; node = node->next; if (node) { fout << sep; } } } void free_singly_linked_list(SinglyLinkedListNode* node) { while (node) { SinglyLinkedListNode* temp = node; node = node->next; free(temp); } } SinglyLinkedListNode* mergeLists(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) { if(!head1) return head2; if(!head2) return head1; SinglyLinkedListNode *p1 = head1, *p2 = head2, *h, *p; if(p1->data < p2->data) { h = p1; p1 = p1->next; } else { h = p2; p2 = p2->next; } p = h; while(p1!=NULL || p2!=NULL) { if(!p2 || (p1 && p1->data < p2->data)) { p->next = p1; p1 = p1->next; } else { p->next = p2; p2 = p2->next; } p = p->next; } return h; } int main() { ofstream fout(getenv("OUTPUT_PATH")); int tests; cin >> tests; cin.ignore(numeric_limits<streamsize>::max(), 'n'); for (int tests_itr = 0; tests_itr < tests; tests_itr++) { SinglyLinkedList* llist1 = new SinglyLinkedList(); int llist1_count; cin >> llist1_count; cin.ignore(numeric_limits<streamsize>::max(), 'n'); for (int i = 0; i < llist1_count; i++) { int llist1_item; cin >> llist1_item; cin.ignore(numeric_limits<streamsize>::max(), 'n'); llist1->insert_node(llist1_item); } SinglyLinkedList* llist2 = new SinglyLinkedList(); int llist2_count; cin >> llist2_count; cin.ignore(numeric_limits<streamsize>::max(), 'n'); for (int i = 0; i < llist2_count; i++) { int llist2_item; cin >> llist2_item; cin.ignore(numeric_limits<streamsize>::max(), 'n'); llist2->insert_node(llist2_item); } SinglyLinkedListNode* llist3 = mergeLists(llist1->head, llist2->head); print_singly_linked_list(llist3, " ", fout); fout << "n"; free_singly_linked_list(llist3); } fout.close(); return 0; } Problem solution in C programming. #include <assert.h> #include <limits.h> #include <math.h> #include <stdbool.h> #include <stddef.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> char* readline(); typedef struct SinglyLinkedListNode SinglyLinkedListNode; typedef struct SinglyLinkedList SinglyLinkedList; struct SinglyLinkedListNode { int data; SinglyLinkedListNode* next; }; struct SinglyLinkedList { SinglyLinkedListNode* head; SinglyLinkedListNode* tail; }; SinglyLinkedListNode* create_singly_linked_list_node(int node_data) { SinglyLinkedListNode* node = malloc(sizeof(SinglyLinkedListNode)); node->data = node_data; node->next = NULL; return node; } void insert_node_into_singly_linked_list(SinglyLinkedList** singly_linked_list, int node_data) { SinglyLinkedListNode* node = create_singly_linked_list_node(node_data); if (!(*singly_linked_list)->head) { (*singly_linked_list)->head = node; } else { (*singly_linked_list)->tail->next = node; } (*singly_linked_list)->tail = node; } void print_singly_linked_list(SinglyLinkedListNode* node, char* sep, FILE* fptr) { while (node) { fprintf(fptr, "%d", node->data); node = node->next; if (node) { fprintf(fptr, "%s", sep); } } } void free_singly_linked_list(SinglyLinkedListNode* node) { while (node) { SinglyLinkedListNode* temp = node; node = node->next; free(temp); } } SinglyLinkedListNode* mergeLists(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) { if (!head1) return head2; if (!head2) return head1; SinglyLinkedListNode* curr1 = head1; SinglyLinkedListNode* curr2 = head2; SinglyLinkedListNode* new_list; SinglyLinkedListNode* curr_new; if (head1->data < head2->data) { new_list = head1; curr1 = curr1->next; } else { new_list = head2; curr2 = curr2->next; } curr_new = new_list; while (curr1 && curr2) { if (curr1->data < curr2->data) { curr_new->next = curr1; curr1 = curr1->next; } else { curr_new->next = curr2; curr2 = curr2->next; } curr_new = curr_new->next; } if (curr1 != NULL) { curr_new->next = curr1; } if (curr2 != NULL) { curr_new->next = curr2; } return new_list; } int main() { FILE* fptr = fopen(getenv("OUTPUT_PATH"), "w"); char* tests_endptr; char* tests_str = readline(); int tests = strtol(tests_str, &tests_endptr, 10); if (tests_endptr == tests_str || *tests_endptr != ' ') { exit(EXIT_FAILURE); } for (int tests_itr = 0; tests_itr < tests; tests_itr++) { SinglyLinkedList* llist1 = malloc(sizeof(SinglyLinkedList)); llist1->head = NULL; llist1->tail = NULL; char* llist1_count_endptr; char* llist1_count_str = readline(); int llist1_count = strtol(llist1_count_str, &llist1_count_endptr, 10); if (llist1_count_endptr == llist1_count_str || *llist1_count_endptr != ' ') { exit(EXIT_FAILURE); } for (int i = 0; i < llist1_count; i++) { char* llist1_item_endptr; char* llist1_item_str = readline(); int llist1_item = strtol(llist1_item_str, &llist1_item_endptr, 10); if (llist1_item_endptr == llist1_item_str || *llist1_item_endptr != ' ') { exit(EXIT_FAILURE); } insert_node_into_singly_linked_list(&llist1, llist1_item); } SinglyLinkedList* llist2 = malloc(sizeof(SinglyLinkedList)); llist2->head = NULL; llist2->tail = NULL; char* llist2_count_endptr; char* llist2_count_str = readline(); int llist2_count = strtol(llist2_count_str, &llist2_count_endptr, 10); if (llist2_count_endptr == llist2_count_str || *llist2_count_endptr != ' ') { exit(EXIT_FAILURE); } for (int i = 0; i < llist2_count; i++) { char* llist2_item_endptr; char* llist2_item_str = readline(); int llist2_item = strtol(llist2_item_str, &llist2_item_endptr, 10); if (llist2_item_endptr == llist2_item_str || *llist2_item_endptr != ' ') { exit(EXIT_FAILURE); } insert_node_into_singly_linked_list(&llist2, llist2_item); } SinglyLinkedListNode* llist3 = mergeLists(llist1->head, llist2->head); char *sep = " "; print_singly_linked_list(llist3, sep, fptr); fprintf(fptr, "n"); free_singly_linked_list(llist3); } fclose(fptr); return 0; } char* readline() { size_t alloc_length = 1024; size_t data_length = 0; char* data = malloc(alloc_length); while (true) { char* cursor = data + data_length; char* line = fgets(cursor, alloc_length - data_length, stdin); if (!line) { break; } data_length += strlen(cursor); if (data_length < alloc_length - 1 || data[data_length - 1] == 'n') { break; } size_t new_length = alloc_length << 1; data = realloc(data, new_length); if (!data) { break; } alloc_length = new_length; } if (data[data_length - 1] == 'n') { data[data_length - 1] = ' '; } data = realloc(data, data_length); return data; } Problem solution in JavaScript programming. 'use strict'; const fs = require('fs'); process.stdin.resume(); process.stdin.setEncoding('utf-8'); let inputString = ''; let currentLine = 0; process.stdin.on('data', inputStdin => { inputString += inputStdin; }); process.stdin.on('end', _ => { inputString = inputString.replace(/s*$/, '') .split('n') .map(str => str.replace(/s*$/, '')); main(); }); function readLine() { return inputString[currentLine++]; } const SinglyLinkedListNode = class { constructor(nodeData) { this.data = nodeData; this.next = null; } }; const SinglyLinkedList = class { constructor() { this.head = null; this.tail = null; } insertNode(nodeData) { const node = new SinglyLinkedListNode(nodeData); if (this.head == null) { this.head = node; } else { this.tail.next = node; } this.tail = node; } }; function printSinglyLinkedList(node, sep, ws) { while (node != null) { ws.write(String(node.data)); node = node.next; if (node != null) { ws.write(sep); } } } function mergeLists(headA, headB) { // Handle empty lists. if (!headA) return headB; if (!headB) return headA; var nodeA = headA; var nodeB = headB; var head = new SinglyLinkedListNode(null); var leader = head; while(nodeA || nodeB){ // Handle reaching the end of either list. if (!nodeA){ leader.next = nodeB; break; } if (!nodeB){ leader.next = nodeA; break; } // Select the next lowest node. if(nodeA.data < nodeB.data){ leader.next = nodeA; nodeA = nodeA.next; } else { leader.next = nodeB; nodeB = nodeB.next; } leader = leader.next; } return head.next; } function main() { const ws = fs.createWriteStream(process.env.OUTPUT_PATH); const tests = parseInt(readLine(), 10); for (let testsItr = 0; testsItr < tests; testsItr++) { const llist1Count = parseInt(readLine(), 10); let llist1 = new SinglyLinkedList(); for (let i = 0; i < llist1Count; i++) { const llist1Item = parseInt(readLine(), 10); llist1.insertNode(llist1Item); } const llist2Count = parseInt(readLine(), 10); let llist2 = new SinglyLinkedList(); for (let i = 0; i < llist2Count; i++) { const llist2Item = parseInt(readLine(), 10); llist2.insertNode(llist2Item); } let llist3 = mergeLists(llist1.head, llist2.head); printSinglyLinkedList(llist3, " ", ws) ws.write("n"); } ws.end(); } coding problems data structure