本文概述
- 建议:在继续解决方案之前, 请先在"实践"上解决它。
- C ++
- C
- Java
- Python3
- C#
- C ++
- C
- Java
- Python3
- C#
推荐:请在"实践首先, 在继续解决方案之前。方法1(迭代)
为了确定两个列表是否相同, 我们需要同时遍历两个列表, 并且在遍历时需要比较数据。
C ++
// An iterative C++ program to check if
// two linked lists are identical or not
#include<
bits/stdc++.h>
using namespace std;
/* Structure for a linked list node */
struct Node
{
int data;
struct Node *next;
};
/* Returns true if linked lists a and b
are identical, otherwise false */
bool areIdentical( struct Node *a, struct Node *b)
{
while (a != NULL &
&
b != NULL)
{
if (a->
data != b->
data)
return false ;
/* If we reach here, then a and b are
not NULL and their data is same, so
move to next nodes in both lists */
a = a->
next;
b = b->
next;
}// If linked lists are identical, then
// 'a' and 'b' must be NULL at this point.
return (a == NULL &
&
b == NULL);
}/* UTILITY FUNCTIONS TO TEST fun1() and fun2() */
/* Given a reference (pointer to pointer) to the
head of a list and an int, push a new node on the
front of the list. */
void push( struct Node** head_ref, int new_data)
{
/* allocate node */
struct Node* new_node =
( struct Node*) malloc ( sizeof ( struct Node));
/* put in the data */
new_node->
data = https://www.lsbin.com/new_data;
/* link the old list off the new node */
new_node->
next = (*head_ref);
/* move the head to point to the new node */
(*head_ref) = new_node;
}// Driver Code
int main()
{
/* The constructed linked lists are :
a: 3->
2->
1
b: 3->
2->
1 */
struct Node *a = NULL;
struct Node *b = NULL;
push(&
a, 1);
push(&
a, 2);
push(&
a, 3);
push(&
b, 1);
push(&
b, 2);
push(&
b, 3);
if (areIdentical(a, b))
cout <
<"Identical" ;
else
cout <
<
"Not identical" ;
return 0;
}// This code is contributed
// by Akanksha Rai
C
// An iterative C program to check if two linked lists are
// identical or not
#include<
stdio.h>
#include<
stdlib.h>
#include<
stdbool.h>
/* Structure for a linked list node */
struct Node
{
int data;
struct Node *next;
};
/* Returns true if linked lists a and b are identical, otherwise false */
bool areIdentical( struct Node *a, struct Node *b)
{
while (a != NULL &
&
b != NULL)
{
if (a->
data != b->
data)
return false ;
/* If we reach here, then a and b are not NULL and
their data is same, so move to next nodes in both
lists */
a = a->
next;
b = b->
next;
}// If linked lists are identical, then 'a' and 'b' must
// be NULL at this point.
return (a == NULL &
&
b == NULL);
}/* UTILITY FUNCTIONS TO TEST fun1() and fun2() */
/* Given a reference (pointer to pointer) to the head
of a list and an int, push a new node on the front
of the list. */
void push( struct Node** head_ref, int new_data)
{
/* allocate node */
struct Node* new_node =
( struct Node*) malloc ( sizeof ( struct Node));
/* put in the data*/
new_node->
data= https://www.lsbin.com/new_data;
/* link the old list off the new node */
new_node->
next = (*head_ref);
/* move the head to point to the new node */
(*head_ref)= new_node;
}/* Driver program to test above function */
int main()
{
/* The constructed linked lists are :
a: 3->
2->
1
b: 3->
2->
1 */
struct Node *a = NULL;
struct Node *b = NULL;
push(&
a, 1);
push(&
a, 2);
push(&
a, 3);
push(&
b, 1);
push(&
b, 2);
push(&
b, 3);
areIdentical(a, b)? printf ("Identical" ):
printf ( "Not identical" );
return 0;
}
Java
// An iterative Java program to check if two linked lists
// are identical or not
class LinkedList
{
Node head;
// head of list/* Linked list Node*/
class Node
{
int data;
Node next;
Node( int d) { data = https://www.lsbin.com/d;
next = null ;
}
}/* Returns true if linked lists a and b are identical, otherwise false */
boolean areIdentical(LinkedList listb)
{
Node a = this .head, b = listb.head;
while (a != null &
&
b != null )
{
if (a.data != b.data)
return false ;
/* If we reach here, then a and b are not null
and their data is same, so move to next nodes
in both lists */
a = a.next;
b = b.next;
}// If linked lists are identical, then'a' and 'b' must
// be null at this point.
return (a == null &
&
b == null );
}/* UTILITY FUNCTIONS TO TEST fun1() and fun2() */
/*Given a reference (pointer to pointer) to the head
of a list and an int, push a new node on the front
of the list. */void push( int new_data)
{
/* 1 &
2: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);
/* 3. Make next of new Node as head */
new_node.next = head;
/* 4. Move the head to point to new Node */
head = new_node;
}/* Driver program to test above functions */
public static void main(String args[])
{
LinkedList llist1 = new LinkedList();
LinkedList llist2 = new LinkedList();
/* The constructed linked lists are :
llist1: 3->
2->
1
llist2: 3->
2->
1 */llist1.push( 1 );
llist1.push( 2 );
llist1.push( 3 );
llist2.push( 1 );
llist2.push( 2 );
llist2.push( 3 );
if (llist1.areIdentical(llist2) == true )
System.out.println( "Identical " );
else
System.out.println( "Not identical " );
}
} /* This code is contributed by Rajat Mishra */
Python3
# An iterative Java program to check if
# two linked lists are identical or not # Linked list Node
class Node:
def __init__( self , d):
self .data = https://www.lsbin.com/d
self . next = Noneclass LinkedList:
def __init__( self ):
self .head = None # head of list # Returns true if linked lists a and b
# are identical, otherwise false
def areIdentical( self , listb):
a = self .head
b = listb.head
while (a ! = None and b ! = None ):
if (a.data ! = b.data):
return False# If we reach here, then a and b
# are not null and their data is
# same, so move to next nodes
# in both lists
a = a. next
b = b. next# If linked lists are identical, # then'a' and 'b' must be null
# at this point.
return (a = = None and b = = None ) # UTILITY FUNCTIONS TO TEST fun1() and fun2()
# Given a reference (pointer to pointer) to the
# head of a list and an int, push a new node on
# the front of the list. def push( self , new_data):# 1 &
2: Allocate the Node &
# Put in the data
new_node = Node(new_data) # 3. Make next of new Node as head
new_node. next = self .head # 4. Move the head to point to new Node
self .head = new_node# Driver Code
llist1 = LinkedList()
llist2 = LinkedList() # The constructed linked lists are :
# llist1: 3->
2->
1
# llist2: 3->
2->
1
llist1.push( 1 )
llist1.push( 2 )
llist1.push( 3 )
llist2.push( 1 )
llist2.push( 2 )
llist2.push( 3 ) if (llist1.areIdentical(llist2) = = True ):
print ( "Identical " )
else :
print ( "Not identical " )# This code is contributed by Prerna Saini
C#
// An iterative C# program to
// check if two linked lists
// are identical or not
using System;
public class LinkedList
{
Node head;
// head of list/* Linked list Node*/
public class Node
{
public int data;
public Node next;
public Node( int d)
{
data = https://www.lsbin.com/d;
next = null ;
}
}/* Returns true if linked lists
a and b are identical, otherwise false */
bool areIdentical(LinkedList listb)
{
Node a = this .head, b = listb.head;
while (a != null &
&
b != null )
{
if (a.data != b.data)
return false ;
/* If we reach here, then a and b are not null
and their data is same, so move to next nodes
in both lists */
a = a.next;
b = b.next;
}// If linked lists are identical, // then'a' and 'b' must
// be null at this point.
return (a == null &
&
b == null );
}/* UTILITY FUNCTIONS TO TEST fun1() and fun2() */
/* Given a reference (pointer to pointer) to the head
of a list and an int, push a new node on the front
of the list. */void push( int new_data)
{
/* 1 &
2: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);
/* 3. Make next of new Node as head */
new_node.next = head;
/* 4. Move the head to point to new Node */
head = new_node;
}/* Driver code */
public static void Main(String []args)
{
LinkedList llist1 = new LinkedList();
LinkedList llist2 = new LinkedList();
/* The constructed linked lists are :
llist1: 3->
2->
1
llist2: 3->
2->
1 */llist1.push(1);
llist1.push(2);
llist1.push(3);
llist2.push(1);
llist2.push(2);
llist2.push(3);
if (llist1.areIdentical(llist2) == true )
Console.WriteLine( "Identical " );
else
Console.WriteLine( "Not identical " );
}
}// This code contributed by Rajput-Ji
输出如下:
Identical
【算法设计(如何检查两个相同的链表())】方法2(递归)
递归解决方案代码比迭代代码干净得多。但是, 你可能不希望将递归版本用于生产代码, 因为它会使用与列表长度成比例的堆栈空间
C ++
// A recursive C++ function to check if two linked
// lists are identical or not
bool areIdentical(Node *a, Node *b)
{
// If both lists are empty
if (a == NULL &
&
b == NULL)
return true ;
// If both lists are not empty, then data of
// current nodes must match, and same should
// be recursively true for rest of the nodes.
if (a != NULL &
&
b != NULL)
return (a->
data =https://www.lsbin.com/= b->
data) &
&
areIdentical(a->
next, b->
next);
// If we reach here, then one of the lists
// is empty and other is not
return false ;
} //This is code is contributed by rathbhupendra
C
// A recursive C function to check if two linked
// lists are identical or not
bool areIdentical( struct Node *a, struct Node *b)
{
// If both lists are empty
if (a == NULL &
&
b == NULL)
return true ;
// If both lists are not empty, then data of
// current nodes must match, and same should
// be recursively true for rest of the nodes.
if (a != NULL &
&
b != NULL)
return (a->
data =https://www.lsbin.com/= b->
data) &
&
areIdentical(a->
next, b->
next);
// If we reach here, then one of the lists
// is empty and other is not
return false ;
}
Java
// A recursive Java method to check if two linked
// lists are identical or not
boolean areIdenticalRecur(Node a, Node b)
{
// If both lists are empty
if (a == null &
&
b == null )
return true ;
// If both lists are not empty, then data of
// current nodes must match, and same should
// be recursively true for rest of the nodes.
if (a != null &
&
b != null )
return (a.data =https://www.lsbin.com/= b.data) &
&
areIdenticalRecur(a.next, b.next);
// If we reach here, then one of the lists
// is empty and other is not
return false ;
}/* Returns true if linked lists a and b are identical, otherwise false */
boolean areIdentical(LinkedList listb)
{
return areIdenticalRecur( this .head, listb.head);
}
Python3
# A recursive Python3 function to check
# if two linked lists are identical or not
def areIdentical(a, b): # If both lists are empty
if (a = = None and b = = None ):
return True# If both lists are not empty, # then data of current nodes must match, # and same should be recursively true
# for rest of the nodes.
if (a ! = None and b ! = None ):
return ((a.data = https://www.lsbin.com/= b.data) and
areIdentical(a. next , b. next )) # If we reach here, then one of the lists
# is empty and other is not
return False# This code is contributed by Princi Singh
C#
// A recursive C# method to
// check if two linked lists
// are identical or not
bool areIdenticalRecur(Node a, Node b)
{
// If both lists are empty
if (a == null &
&
b == null )
return true ;
// If both lists are not empty, then data of
// current nodes must match, and same should
// be recursively true for rest of the nodes.
if (a != null &
&
b != null )
return (a.data =https://www.lsbin.com/= b.data) &
&
areIdenticalRecur(a.next, b.next);
// If we reach here, then one of the lists
// is empty and other is not
return false ;
} /* Returns true if linked lists
a and b are identical, otherwise false */
bool areIdentical(LinkedList listb)
{
return areIdenticalRecur( this .head, listb.head);
}
}// This code is contributed by princiraj1992
时间复杂度:迭代和递归版本均为O(n)。 n是a和b中较小列表的长度。
如果你发现上述代码/算法有误, 请写评论, 或者找到解决同一问题的更好方法。
推荐阅读
- 如何实现斐波那契堆(–删除,提取最小值和减小键(Fibonacci Heap))
- SASS如何使用数值运算符(详细介绍和代码实例)
- PHP如何使用array_chunk()函数(代码示例)
- 页表中的页表项简要介绍
- Java中的方法重载和重写覆盖的区别指南(代码示例)
- 9大秘笈处理Windows系统中忘记密码现象
- 你不得不知的WindowsPE用法
- 对于进程与Windows应用程序的介绍
- 4大原因导致“虚拟内存不够”的出现