📜  交替合并两个链表的奇偶位置节点

📅  最后修改于: 2021-09-07 02:36:07             🧑  作者: Mango

给定两个链表L1L2,该任务是打印通过合并L1奇数位置的节点与交替L2偶数定位节点获得一个新的列表。

例子:

处理方法:按照以下步骤解决问题:

  • L1第一个节点开始遍历,同时开始遍历L2的第二个节点。
  • L1第一个节点添加到结果列表中,并将其与L2的第二个节点连接并移动到L1 中下一个奇数节点。同样,add 将L2第二个节点连接到L1当前奇数节点并移动到L2 中下一个偶数节点
  • 重复上述步骤,直到到达列表之一的末尾。
  • 遍历另一个列表并不断将所需节点从该列表添加到结果列表中。
  • 最后,打印结果列表。

下面是上述方法的实现:

C++
// C++ program to implement
// the above approach
 
#include 
using namespace std;
 
// Structure of a Node
class node {
public:
    int data;
    node* next;
    node(int d)
    {
        data = d;
        next = NULL;
    }
};
 
// Function to insert the node
// at the head of the linkedlist
void insert_at_head(node*& head, int data)
{
    node* n = new node(data);
    n->next = head;
    head = n;
    return;
}
 
// Function to print the linked list
void print(node* head)
{
    while (head != NULL) {
        cout << head->data << " ";
        head = head->next;
    }
    cout << endl;
    return;
}
 
// Function to merge the odd and
// even positioned nodes of two
// given linked lists alternately
node* merge_alternate(node* head1, node* head2)
{
    // Traverse from the second
    // node of second linked list
    if (head2)
        head2 = head2->next;
 
    // Stores the head of
    // the resultant list
    node* head3 = NULL;
 
    // Stores the current node
    node* cur = NULL;
 
    // Store the first node of
    // first list in the result
    if (head1)
        head3 = head1;
 
    // Otherwise
    else
        head3 = head2;
 
    // Traverse until end of a
    // one of the list is reached
    while (head1 != NULL && head2 != NULL) {
 
        // If there is a previous node then
        // connect that with the current node
        if (cur)
            cur->next = head1;
 
        // Update the current node
        cur = head1;
 
        // If next odd node exists
        if (head1->next != NULL)
 
            // Store the next odd node
            head1 = head1->next->next;
 
        // Otherwise
        else
 
            // Reach end of list
            head1 = NULL;
 
        // Connect the first node
        // with the second node
        cur->next = head2;
 
        // Update the current node
        cur = head2;
 
        // If next even node exists
        if (head2->next != NULL)
 
            // Store the next even node
            head2 = head2->next->next;
 
        // Otherwise
        else
 
            // Reach the end of the list
            head2 = NULL;
    }
 
    // If end of the second
    // list has been reached
    while (head1 != NULL) {
 
        // Connect with the
        // previous node
        if (cur)
            cur->next = head1;
 
        // Update the current node
        cur = head1;
 
        // If next odd node exists
        if (head1->next != NULL)
 
            // Store the next odd node
            head1 = head1->next->next;
 
        // Otherwise
        else
 
            // Reach end of list
            head1 = NULL;
    }
 
    // If end of second list
    // has been reached
    while (head2 != NULL) {
 
        // Connect with the
        // previous node
        if (cur)
            cur->next = head2;
 
        // Update the current node
        cur = head2;
 
        // If next even node exists
        if (head2->next != NULL)
 
            // Store the next odd node
            head2 = head2->next->next;
 
        // Otherwise
        else
 
            // Reach end of list
            head2 = NULL;
    }
 
    // End of the resultant list
    if (cur)
        cur->next = NULL;
 
    // Returning the head of
    // the resultant node
    return head3;
}
 
// Driver Code
int main()
{
    node *head1 = NULL, *head2 = NULL;
 
    // Create linked list
    insert_at_head(head1, 6);
    insert_at_head(head1, 19);
    insert_at_head(head1, 13);
    insert_at_head(head1, 12);
    insert_at_head(head1, 10);
    insert_at_head(head1, 5);
    insert_at_head(head1, 1);
 
    insert_at_head(head2, 9);
    insert_at_head(head2, 7);
    insert_at_head(head2, 2);
 
    // Merging the linked lists
    head1 = merge_alternate(head1, head2);
 
    print(head1);
}


Java
// Java program to implement
// the above approach
import java.util.*;
class GFG{
 
// Structure of a Node
static class node
{
  public int data;
  node next;
  node(int d)
  {
    data = d;
    next = null;
  }
};
 
// Function to insert the node
// at the head of the linkedlist
static node insert_at_head(node head,
                           int data)
{
  node n = new node(data);
  n.next = head;
  head = n;
  return head;
}
 
// Function to print the linked list
static void print(node head)
{
  while (head != null)
  {
    System.out.print(head.data + " ");
    head = head.next;
  }
  System.out.println();
  return;
}
 
// Function to merge the odd and
// even positioned nodes of two
// given linked lists alternately
static node merge_alternate(node head1,
                            node head2)
{
  // Traverse from the second
  // node of second linked list
  if (head2 != null)
    head2 = head2.next;
 
  // Stores the head of
  // the resultant list
  node head3 = null;
 
  // Stores the current node
  node cur = null;
 
  // Store the first node of
  // first list in the result
  if (head1 != null)
    head3 = head1;
 
  // Otherwise
  else
    head3 = head2;
 
  // Traverse until end of a
  // one of the list is reached
  while (head1 != null && head2 != null)
  {
    // If there is a previous node then
    // connect that with the current node
    if (cur != null)
      cur.next = head1;
 
    // Update the current node
    cur = head1;
 
    // If next odd node exists
    if (head1.next != null)
 
      // Store the next odd node
      head1 = head1.next.next;
 
    // Otherwise
    else
 
      // Reach end of list
      head1 = null;
 
    // Connect the first node
    // with the second node
    cur.next = head2;
 
    // Update the current node
    cur = head2;
 
    // If next even node exists
    if (head2.next != null)
 
      // Store the next even node
      head2 = head2.next.next;
 
    // Otherwise
    else
 
      // Reach the end of the list
      head2 = null;
  }
 
  // If end of the second
  // list has been reached
  while (head1 != null)
  {
    // Connect with the
    // previous node
    if (cur != null)
      cur.next = head1;
 
    // Update the current node
    cur = head1;
 
    // If next odd node exists
    if (head1.next != null)
 
      // Store the next odd node
      head1 = head1.next.next;
 
    // Otherwise
    else
 
      // Reach end of list
      head1 = null;
  }
 
  // If end of second list
  // has been reached
  while (head2 != null)
  {
    // Connect with the
    // previous node
    if (cur != null)
      cur.next = head2;
 
    // Update the current node
    cur = head2;
 
    // If next even node exists
    if (head2.next != null)
 
      // Store the next odd node
      head2 = head2.next.next;
 
    // Otherwise
    else
 
      // Reach end of list
      head2 = null;
  }
 
  // End of the resultant list
  if (cur != null)
    cur.next = null;
 
  // Returning the head of
  // the resultant node
  return head3;
}
 
// Driver Code
public static void main(String[] args)
{
  node head1 = null, head2 = null;
 
  // Create linked list
  head1 = insert_at_head(head1, 6);
  head1 = insert_at_head(head1, 19);
  head1 = insert_at_head(head1, 13);
  head1 = insert_at_head(head1, 12);
  head1 = insert_at_head(head1, 10);
  head1 = insert_at_head(head1, 5);
  head1 = insert_at_head(head1, 1);
 
  head2 = insert_at_head(head2, 9);
  head2 = insert_at_head(head2, 7);
  head2 = insert_at_head(head2, 2);
 
  // Merging the linked lists
  head1 = merge_alternate(head1, head2);
 
  print(head1);
}
}
 
// This code is contributed by gauravrajput1


Python3
# Python3 program to implement
# the above approach
  
# Structure of a Node
class node:
     
    def __init__(self, d):
     
        self.data = d;
        self.next = None;
     
# Function to insert the node
# at the head of the linkedlist
def insert_at_head(head, data):
 
    n = node(data);
    n.next = head;
    head = n;
    return head;
  
# Function to print the linked list
def printx(head):
 
    while (head != None):
        print(head.data, end = ' ')
        head = head.next;
     
    print()
     
    return;
  
# Function to merge the odd and
# even positioned nodes of two
# given linked lists alternately
def merge_alternate(head1, head2):
 
    # Traverse from the second
    # node of second linked list
    if (head2):
        head2 = head2.next;
  
    # Stores the head of
    # the resultant list
    head3 = None;
  
    # Stores the current node
    cur = None;
  
    # Store the first node of
    # first list in the result
    if (head1):
        head3 = head1;
  
    # Otherwise
    else:
        head3 = head2;
  
    # Traverse until end of a
    # one of the list is reached
    while (head1 != None and head2 != None):
  
        # If there is a previous node then
        # connect that with the current node
        if (cur):
            cur.next = head1;
  
        # Update the current node
        cur = head1;
  
        # If next odd node exists
        if (head1.next != None):
  
            # Store the next odd node
            head1 = head1.next.next;
  
        # Otherwise
        else:
  
            # Reach end of list
            head1 = None;
  
        # Connect the first node
        # with the second node
        cur.next = head2;
  
        # Update the current node
        cur = head2;
  
        # If next even node exists
        if (head2.next != None):
  
            # Store the next even node
            head2 = head2.next.next;
  
        # Otherwise
        else:
  
            # Reach the end of the list
            head2 = None;
     
  
    # If end of the second
    # list has been reached
    while (head1 != None):
  
        # Connect with the
        # previous node
        if (cur):
            cur.next = head1;
  
        # Update the current node
        cur = head1;
  
        # If next odd node exists
        if (head1.next != None):
  
            # Store the next odd node
            head1 = head1.next.next;
  
        # Otherwise
        else:  
  
            # Reach end of list
            head1 = None;
  
    # If end of second list
    # has been reached
    while (head2 != None):
  
        # Connect with the
        # previous node
        if (cur):
            cur.next = head2;
  
        # Update the current node
        cur = head2;
  
        # If next even node exists
        if (head2.next != None):
  
            # Store the next odd node
            head2 = head2.next.next;
  
        # Otherwise
        else:
  
            # Reach end of list
            head2 = None;
  
    # End of the resultant list
    if (cur):
        cur.next = None;
  
    # Returning the head of
    # the resultant node
    return head3;
 
  
# Driver Code
if __name__=='__main__':
     
    head1 = None
    head2 = None;
  
    # Create linked list
    head1 = insert_at_head(head1, 6);
    head1 = insert_at_head(head1, 19);
    head1 = insert_at_head(head1, 13);
    head1 = insert_at_head(head1, 12);
    head1 = insert_at_head(head1, 10);
    head1 = insert_at_head(head1, 5);
    head1 = insert_at_head(head1, 1);
  
    head2 = insert_at_head(head2, 9);
    head2 = insert_at_head(head2, 7);
    head2 = insert_at_head(head2, 2)
  
    # Merging the linked lists
    head1 = merge_alternate(head1, head2);
  
    printx(head1);
 
  # This code is contributed by rutvik_56


C#
// C# program to implement
// the above approach
using System;
class GFG{
 
// Structure of a Node
class node
{
  public int data;
  public node next;
  public node(int d)
  {
    data = d;
    next = null;
  }
};
 
// Function to insert the node
// at the head of the linkedlist
static node insert_at_head(node head,
                           int data)
{
  node n = new node(data);
  n.next = head;
  head = n;
  return head;
}
 
// Function to print the linked list
static void print(node head)
{
  while (head != null)
  {
    Console.Write(head.data + " ");
    head = head.next;
  }
   
  Console.WriteLine();
  return;
}
 
// Function to merge the odd and
// even positioned nodes of two
// given linked lists alternately
static node merge_alternate(node head1,
                            node head2)
{
  // Traverse from the second
  // node of second linked list
  if (head2 != null)
    head2 = head2.next;
 
  // Stores the head of
  // the resultant list
  node head3 = null;
 
  // Stores the current node
  node cur = null;
 
  // Store the first node of
  // first list in the result
  if (head1 != null)
    head3 = head1;
 
  // Otherwise
  else
    head3 = head2;
 
  // Traverse until end of a
  // one of the list is reached
  while (head1 != null &&
         head2 != null)
  {
    // If there is a previous
    // node then connect that
    // with the current node
    if (cur != null)
      cur.next = head1;
 
    // Update the current node
    cur = head1;
 
    // If next odd node exists
    if (head1.next != null)
 
      // Store the next odd node
      head1 = head1.next.next;
 
    // Otherwise
    else
 
      // Reach end of list
      head1 = null;
 
    // Connect the first node
    // with the second node
    cur.next = head2;
 
    // Update the current node
    cur = head2;
 
    // If next even node exists
    if (head2.next != null)
 
      // Store the next even node
      head2 = head2.next.next;
 
    // Otherwise
    else
 
      // Reach the end of the list
      head2 = null;
  }
 
  // If end of the second
  // list has been reached
  while (head1 != null)
  {
    // Connect with the
    // previous node
    if (cur != null)
      cur.next = head1;
 
    // Update the current node
    cur = head1;
 
    // If next odd node exists
    if (head1.next != null)
 
      // Store the next odd node
      head1 = head1.next.next;
 
    // Otherwise
    else
 
      // Reach end of list
      head1 = null;
  }
 
  // If end of second list
  // has been reached
  while (head2 != null)
  {
    // Connect with the
    // previous node
    if (cur != null)
      cur.next = head2;
 
    // Update the current node
    cur = head2;
 
    // If next even node exists
    if (head2.next != null)
 
      // Store the next odd node
      head2 = head2.next.next;
 
    // Otherwise
    else
 
      // Reach end of list
      head2 = null;
  }
 
  // End of the resultant list
  if (cur != null)
    cur.next = null;
 
  // Returning the head of
  // the resultant node
  return head3;
}
 
// Driver Code
public static void Main(String[] args)
{
  node head1 = null, head2 = null;
 
  // Create linked list
  head1 = insert_at_head(head1, 6);
  head1 = insert_at_head(head1, 19);
  head1 = insert_at_head(head1, 13);
  head1 = insert_at_head(head1, 12);
  head1 = insert_at_head(head1, 10);
  head1 = insert_at_head(head1, 5);
  head1 = insert_at_head(head1, 1);
 
  head2 = insert_at_head(head2, 9);
  head2 = insert_at_head(head2, 7);
  head2 = insert_at_head(head2, 2);
 
  // Merging the linked lists
  head1 = merge_alternate(head1, head2);
 
  print(head1);
}
}
 
// This code is contributed by Princi Singh


Javascript


输出:
1 7 10 13 6

时间复杂度: O(N)
辅助空间: O(1)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live