📌  相关文章
📜  比较链接列表表示的数字

📅  最后修改于: 2021-04-23 18:56:59             🧑  作者: Mango

给定指向两个链接列表的头节点的指针。任务是比较链接列表表示的数字。列表表示的数字可能包含前导零。

  1. 如果数字相等,则打印0
  2. 如果第一个链表表示的数字更大,则打印1
  3. 如果第二个链接列表表示的数字更大,则打印-1

例子:

方法:由于数字可能包含前导零,因此请首先从链接列表的开头删除所有前导零。在比较它们的长度之后,如果长度不相等,则意味着其中一个数字肯定更大,并根据长度更大而返回1或-1。否则,同时遍历两个列表,并且遍历时,我们比较每个节点上的数字。如果在任何时候数字不相等,则根据数字的值返回1或-1。如果到达链表的末尾,则链表是相同的,因此返回0。
下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
/* Structure for a linked list node */
struct Node {
    int data;
    struct Node* next;
};
 
/* A helper function to remove zeros from
the start of the linked list */
Node* removeLeadingZeros(struct Node* a)
{
    if (a != NULL && a->data == 0)
        return removeLeadingZeros(a->next);
    else
        return a;
}
 
/* A hepler function to find the length of
linked list*/
int getSize(struct Node* a)
{
    int sz = 0;
    while (a != NULL) {
        a = a->next;
        sz++;
    }
    return sz;
}
 
/* 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));
 
    /* Set the data */
    new_node->data = new_data;
 
    /* Link the old list after the new node */
    new_node->next = (*head_ref);
 
    /* Set the head to point to the new node */
    (*head_ref) = new_node;
}
 
// Function to compar ethe numbers
// represented as linked lists
int compare(struct Node* a,
            struct Node* b)
{
 
    // Remover leading zeroes from
    // the linked lists
    a = removeLeadingZeros(a);
    b = removeLeadingZeros(b);
 
    int lenA = getSize(a);
    int lenB = getSize(b);
 
    if (lenA > lenB) {
 
        /* Since the number represented by a
        has a greater length, it will be greater*/
        return 1;
    }
    else if (lenB > lenA) {
        return -1;
    }
 
    /* If the lenghts of two numbers are equal
        we have to check their magnitudes*/
    while (a != NULL && b != NULL) {
        if (a->data > b->data)
            return 1;
        else if (a->data < b->data)
            return -1;
 
        /* 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
    // we need to return zero
    return 0;
}
 
// Driver code
int main()
{
    /* The constructed linked lists are :
    a: 5->6->7
    b: 2->3->3 */
    struct Node* a = NULL;
    push(&a, 7);
    push(&a, 6);
    push(&a, 5);
 
    struct Node* b = NULL;
    push(&b, 3);
    push(&b, 3);
    push(&b, 2);
 
    cout << compare(a, b);
 
    return 0;
}


Java
// Java implementation of the approach
class GFG
{
 
/* Structure for a linked list node */
static class Node
{
    int data;
    Node next;
};
 
/* A helper function to remove zeros from
the start of the linked list */
static Node removeLeadingZeros(Node a)
{
    if (a != null && a.data == 0)
        return removeLeadingZeros(a.next);
    else
        return a;
}
 
/* A hepler function to find the length of
linked list*/
static int getSize(Node a)
{
    int sz = 0;
    while (a != null)
    {
        a = a.next;
        sz++;
    }
    return sz;
}
 
/* 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. */
static Node push(Node head_ref, int new_data)
{
    /* Allocate node */
    Node new_node = new Node();
 
    /* Set the data */
    new_node.data = new_data;
 
    /* Link the old list after the new node */
    new_node.next = head_ref;
 
    /* Set the head to point to the new node */
    head_ref = new_node;
    return head_ref;
}
 
// Function to compar ethe numbers
// represented as linked lists
static int compare(Node a,
                   Node b)
{
 
    // Remover leading zeroes from
    // the linked lists
    a = removeLeadingZeros(a);
    b = removeLeadingZeros(b);
 
    int lenA = getSize(a);
    int lenB = getSize(b);
 
    if (lenA > lenB)
    {
 
        /* Since the number represented by a
        has a greater length, it will be greater*/
        return 1;
    }
     
    else if (lenB > lenA)
    {
        return -1;
    }
 
    /* If the lenghts of two numbers are equal
        we have to check their magnitudes*/
    while (a != null && b != null)
    {
        if (a.data > b.data)
            return 1;
        else if (a.data < b.data)
            return -1;
 
        /* 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
    // we need to return zero
    return 0;
}
 
// Driver code
public static void main(String[] args)
{
     
    /* The constructed linked lists are :
    a: 5->6->7
    b: 2->3->3 */
    Node a = null;
    a = push(a, 7);
    a = push(a, 6);
    a = push(a, 5);
 
    Node b = null;
    b = push(b, 3);
    b = push(b, 3);
    b = push(b, 2);
 
    System.out.println(compare(a, b));
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 implementation of the approach
  
''' Structure for a linked list node '''
class Node:
     
    def __init__(self):
        self.data = 0
        self.next = None
         
''' A helper function to remove zeros from
the start of the linked list '''
def removeLeadingZeros(a):
 
    if (a != None and a.data == 0):
        return removeLeadingZeros(a.next);
    else:
        return a;
 
''' A hepler function to find the length of
linked list'''
def getSize(a):
 
    sz = 0;
     
    while (a != None):
        a = a.next;
        sz += 1
     
    return sz;
 
''' 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(head_ref, new_data):
 
    ''' Allocate node '''
    new_node = Node()
  
    ''' Set the data '''
    new_node.data = new_data;
  
    ''' Link the old list after the new node '''
    new_node.next = (head_ref);
  
    ''' Set the head to point to the new node '''
    (head_ref) = new_node;
 
    return head_ref
  
# Function to compar ethe numbers
# represented as linked lists
def compare(a, b):
  
    # Remover leading zeroes from
    # the linked lists
    a = removeLeadingZeros(a);
    b = removeLeadingZeros(b);
  
    lenA = getSize(a);
    lenB = getSize(b);
  
    if (lenA > lenB):
  
        ''' Since the number represented by a
        has a greater length, it will be greater'''
        return 1;
     
    elif (lenB > lenA):
        return -1;
     
    ''' If the lenghts of two numbers are equal
        we have to check their magnitudes'''
    while (a != None and b != None):
        if (a.data > b.data):
            return 1;
        elif (a.data < b.data):
            return -1;
  
        ''' If we reach here, then a and b are
        not None 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
    # we need to return zero
    return 0;
 
# Driver code
if __name__=='__main__':
     
    ''' The constructed linked lists are :
    a: 5.6.7
    b: 2.3.3 '''
    a = None;
    a = push(a, 7);
    a = push(a, 6);
    a = push(a, 5);
  
    b = None;
    b = push(b, 3);
    b = push(b, 3);
    b = push(b, 2);
  
    print(compare(a, b))
  
# This code is contributed by rutvik_56


C#
// C# implementation of the approach
using System;
using System.Collections.Generic;            
 
class GFG
{
 
/* Structure for a linked list node */
public class Node
{
    public int data;
    public Node next;
};
 
/* A helper function to remove zeros from
the start of the linked list */
static Node removeLeadingZeros(Node a)
{
    if (a != null && a.data == 0)
        return removeLeadingZeros(a.next);
    else
        return a;
}
 
/* A hepler function to find the length of
linked list*/
static int getSize(Node a)
{
    int sz = 0;
    while (a != null)
    {
        a = a.next;
        sz++;
    }
    return sz;
}
 
/* 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. */
static Node push(Node head_ref, int new_data)
{
    /* Allocate node */
    Node new_node = new Node();
 
    /* Set the data */
    new_node.data = new_data;
 
    /* Link the old list after the new node */
    new_node.next = head_ref;
 
    /* Set the head to point to the new node */
    head_ref = new_node;
    return head_ref;
}
 
// Function to compar ethe numbers
// represented as linked lists
static int compare(Node a, Node b)
{
 
    // Remover leading zeroes from
    // the linked lists
    a = removeLeadingZeros(a);
    b = removeLeadingZeros(b);
 
    int lenA = getSize(a);
    int lenB = getSize(b);
 
    if (lenA > lenB)
    {
 
        /* Since the number represented by a
        has a greater length, it will be greater*/
        return 1;
    }
     
    else if (lenB > lenA)
    {
        return -1;
    }
 
    /* If the lenghts of two numbers are equal
        we have to check their magnitudes*/
    while (a != null && b != null)
    {
        if (a.data > b.data)
            return 1;
        else if (a.data < b.data)
            return -1;
 
        /* 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
    // we need to return zero
    return 0;
}
 
// Driver code
public static void Main(String[] args)
{
     
    /* The constructed linked lists are :
    a: 5->6->7
    b: 2->3->3 */
    Node a = null;
    a = push(a, 7);
    a = push(a, 6);
    a = push(a, 5);
 
    Node b = null;
    b = push(b, 3);
    b = push(b, 3);
    b = push(b, 2);
 
    Console.WriteLine(compare(a, b));
}
}
 
// This code is contributed by 29AjayKumar


输出:
1

时间复杂度: O(max(N,M)),其中N和M是链表的长度。