A PHP Error was encountered

Severity: 8192

Message: str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated

Filename: libraries/Filtered_db.php

Line Number: 23

Find intersection of two linked lists using C++ program
Q:

Find intersection of two linked lists using C++ program

0

 Write a C++ program to find the intersection of two single linked lists.

Example:

    Let the first linked list be:
    6->5->2->9->NULL

    Let the second linked list to be:
    2->7->NULL

    So there intersection is:
    2->NULL

All Answers

need an explanation for this answer? contact us directly to get an explanation for this answer

Brute force approach:

One technique can be to traverse all the nodes of a linked list and check whether the traversed node is in the other linked list or not. Such an approach takes O(m*n) times complexitymn=length of linked lists.

Efficient approach:

Efficient approach use to use merge sort.

    1. Sort both the linked list using merge sort. ( for detailed refer to: Merge sort for single linked lists)
    2. Scan each linked list and build intersection according to following:
IF (list1->data < list2->data)
	No intersection found
	Traverse list1 by one step( list1=list1->next)
ELSE IF(list1->data ==list2->data)
	Createnode(list1->data) && append node to the intersection list
	Traverse list1 by one step( list1=list1->next)
	Traverse list2 by one step( list2=list2->next)
ELSE//list1->data >list2->data
	No intersection found
	Traverse list2 by one step( list2=list2->next)
END IF-ELSE
  1. Display the intersection list

C++ implementation to find intersection of two linked lists

#include<bits/stdc++.h>
using namespace std;

class node{
	public:
	int data; // data field
	struct node *next;
};

void display(class node* head){
	node* current=head; // current node set to head
	//traverse until current node isn't NULL
	while(current!=NULL){ 
		printf("%d ",current->data);
		current=current->next; // go to next node
	}
}

node* creatnode(int d){
	node* temp=(node*)malloc(sizeof(node));
	temp->data=d;
	temp->next=NULL;
	return temp;
}

//merging two sorted list 
node* mergeList(node* split1,node* split2){
	node* newhead=NULL;
	//base cases
	if(split1==NULL)
		return split2;
	if(split2==NULL)
		return split1;

	if(split1->data<=split2->data){
		newhead=split1;
		newhead->next=mergeList(split1->next,split2);
	}
	else{
		newhead=split2;
		newhead->next=mergeList(split1,split2->next);
	}
	return newhead;
}

//split list for merge sort
void splitList(node* head,node** split1,node** split2){ 
	node* slow=head;
	node* fast=head->next;

	while(fast!=NULL){
		fast=fast->next;
		if(fast!=NULL){
			slow=slow->next;
			fast=fast->next;
		}
	}

	*split1=head;
	*split2=slow->next;
	//spliting
	slow->next=NULL;
}

//merge sort
void mergeSort(node** refToHead){ 
	node* head=*refToHead;
	node* split1,*split2;
	//base case
	if(head==NULL || head->next==NULL){
		return;
	}
	//split the list in two halves
	splitList(head,&split1,&split2);
	//recursively sort the two halves
	mergeSort(&split1);
	mergeSort(&split2);

	*refToHead=mergeList(split1,split2);

	return;
}

node* findIntersection(node* head1, node* head2){
	//base case
	if(head1==NULL && head2==NULL)
	return NULL;

	node* head4=NULL,*temp;
	//for inserting the first common node
	while( head1!=NULL && head2!=NULL && head4==NULL){ 
		if(head1->data<head2->data){
			head1=head1->next;
		}
		//intersection nodes(intersection)
		else if(head1->data==head2->data){ 
			head4=creatnode(head1->data);
			temp=head4;
			head1=head1->next;
			head2=head2->next;
		}
		else{
			head2=head2->next;
		}
	}
	
	//for other common nodes(intersection)
	while( head1!=NULL && head2!=NULL){ 
		if(head1->data<head2->data){
			head1=head1->next;
		}
		//intersection nodes
		else if(head1->data==head2->data){ 
			temp->next=creatnode(head1->data);
			temp=temp->next;

			head1=head1->next;
			head2=head2->next;
		}
		else{
			head2=head2->next;
		}
	}

	return head4;
}

int main(){
	printf("creating the linked list by inserting new nodes at the end\n");
	printf("enter 0 to stop building the list, else enter any integer\n");
	int k;
	node* curr,*temp;
	cout<<"enter list1...\n";
	scanf("%d",&k);
	node* head1=creatnode(k); //buliding list, first node
	scanf("%d",&k);
	temp=head1;

	///////////////////inserting at the end//////////////////////
	while(k){
		curr=creatnode(k);
		temp->next=curr;//appending each node
		temp=temp->next;
		scanf("%d",&k);
	}
	cout<<"displaying list1...\n";
	display(head1); // displaying the list
	cout<<"\nenter list2...\n";
	scanf("%d",&k);
	node* head2=creatnode(k); //buliding list, first node
	scanf("%d",&k);
	temp=head2;

	///////////////////inserting at the end//////////////////////
	while(k){
		curr=creatnode(k);
		temp->next=curr;//appending each node
		temp=temp->next;
		scanf("%d",&k);
	}
	cout<<"displaying list1...\n";
	display(head2);

	//sort both the lists
	mergeSort(&head1);
	mergeSort(&head2);

	cout<<"\ndisplaying their intersection...\n";

	node* head4=findIntersection(head1,head2);
	if(head4)
		display(head4);
	else
		cout<<"No intersection found\n";
	return 0;
}

Output

 
First run:
creating the linked list by inserting new nodes at the end
enter 0 to stop building the list, else enter any integer
enter list1...
6 5 2 9 0
displaying list1...
6 5 2 9
enter list2...
2 7 0
displaying list1...
2 7
displaying their intersection...
2 

Second run:
creating the linked list by inserting new nodes at the end
enter 0 to stop building the list, else enter any integer
enter list1...
6 7 8 0
displaying list1...
6 7 8
enter list2...
1 5 2 0
displaying list1...
1 5 2
displaying their intersection...
No intersection found

need an explanation for this answer? contact us directly to get an explanation for this answer

total answers (1)

This question belongs to these collections

Similar questions


need a help?


find thousands of online teachers now