Divide the given linked list in two lists of size ratio p:q
Last Updated :
02 Nov, 2021
Given a linked list and two integers p and q, the task is to divide the linked list in the ratio p:q i.e. the first list contains first p nodes from the original list and the second list contains the rest of the q nodes. If the original list cannot be split in the given ratio then print -1.
Examples:
Input: 1 -> 3 -> 5 -> 6 -> 7 -> 2 -> NULL
p = 2, q = 4
Output:
1 3
5 6 7 2
Input: 1 -> 2 -> 4 -> 9 -> NULL
p = 3, q = 2
Output: -1
Approach: First find the length of the linked list. If the total ratio sum exceeds the actual length then dividing the list is not possible so print -1. If it is possible to divide the list then simply traverse the list up to length p and break it into the ratio p:q. Next node will be the head of the second list then print both the lists.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int data;
Node *next;
Node( int data)
{
this ->data = data;
this ->next = NULL;
}
};
void printList(Node *);
void splitAndPrint(Node *head, int p, int q)
{
int n = 0;
Node *temp;
temp = head;
while (temp != NULL)
{
n += 1;
temp = temp->next;
}
if (p + q > n)
{
cout << "-1" << endl;
return ;
}
temp = head;
while (p > 1)
{
temp = temp->next;
p -= 1;
}
Node *head2 = temp->next;
temp->next = NULL;
printList(head);
cout << endl;
printList(head2);
}
void printList(Node* head)
{
if (head == NULL)
return ;
cout << head->data << " " ;
printList(head->next);
}
int main()
{
Node* head = new Node(1);
head->next = new Node(3);
head->next->next = new Node(5);
head->next->next->next = new Node(6);
head->next->next->next->next = new Node(7);
head->next->next->next->next->next = new Node(2);
int p = 2, q = 4;
splitAndPrint(head, p, q);
}
|
Java
class GFG
{
static class Node
{
int data;
Node next;
Node( int data)
{
this .data = data;
}
}
static void splitAndPrint(Node head, int p, int q)
{
int n = 0 ;
Node temp;
temp = head;
while (temp!= null )
{
n += 1 ;
temp = temp.next;
}
if (p + q > n)
{
System.out.println( "-1" );
return ;
}
temp = head;
while (p > 1 )
{
temp = temp.next;
p-= 1 ;
}
Node head2 = temp.next;
temp.next = null ;
printList(head);
System.out.println();
printList(head2);
}
static void printList(Node head)
{
if ( head == null )
return ;
System.out.print(head.data+ " , " );
printList(head.next);
}
public static void main(String args[])
{
Node head = new Node( 1 );
head.next = new Node( 3 );
head.next.next = new Node( 5 );
head.next.next.next = new Node( 6 );
head.next.next.next.next = new Node( 7 );
head.next.next.next.next.next = new Node( 2 );
int p = 2 ,q= 4 ;
splitAndPrint(head, p, q);
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self . next = None
def splitAndPrint(head, p, q):
n, temp = 0 , head
while (temp):
n + = 1
temp = temp. next
if p + q>n:
print ( "-1" )
return
temp = head
while (p> 1 ):
temp = temp. next
p - = 1
head2 = temp. next
temp. next = None
printList(head)
print ()
printList(head2)
def printList(head):
if not head:
return
print ( "{} " . format (head.data), end = "")
printList(head. next )
head = Node( 1 )
head. next = Node( 3 )
head. next . next = Node( 5 )
head. next . next . next = Node( 6 )
head. next . next . next . next = Node( 7 )
head. next . next . next . next . next = Node( 2 )
p, q = 2 , 4
splitAndPrint(head, p, q)
|
C#
using System;
class GFG
{
public class Node
{
public int data;
public Node next;
public Node( int data)
{
this .data = data;
}
}
static void splitAndPrint(Node head, int p, int q)
{
int n = 0;
Node temp;
temp = head;
while (temp != null )
{
n += 1;
temp = temp.next;
}
if (p + q > n)
{
Console.WriteLine( "-1" );
return ;
}
temp = head;
while (p > 1)
{
temp = temp.next;
p-= 1;
}
Node head2 = temp.next;
temp.next = null ;
printList(head);
Console.WriteLine();
printList(head2);
}
static void printList(Node head)
{
if ( head == null )
return ;
Console.Write(head.data+ " " );
printList(head.next);
}
public static void Main(String []args)
{
Node head = new Node(1);
head.next = new Node(3);
head.next.next = new Node(5);
head.next.next.next = new Node(6);
head.next.next.next.next = new Node(7);
head.next.next.next.next.next = new Node(2);
int p = 2, q = 4;
splitAndPrint(head, p, q);
}
}
|
Javascript
<script>
class Node
{
constructor(data)
{
this .data = data;
}
}
function splitAndPrint( head, p, q)
{
var n = 0;
var temp;
temp = head;
while (temp!= null )
{
n += 1;
temp = temp.next;
}
if (p + q > n)
{
document.write( "-1" );
return ;
}
temp = head;
while (p > 1)
{
temp = temp.next;
p-= 1;
}
var head2 = temp.next;
temp.next = null ;
printList(head);
document.write( "</br>" );
printList(head2);
}
function printList(head)
{
if ( head == null )
return ;
document.write(head.data + " " );
printList(head.next);
}
let head = new Node(1);
head.next = new Node(3);
head.next.next = new Node(5);
head.next.next.next = new Node(6);
head.next.next.next.next = new Node(7);
head.next.next.next.next.next = new Node(2);
let p = 2, q = 4;
splitAndPrint(head, p, q);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...