📜  将整个链表插入 other 在第 k 个位置

📅  最后修改于: 2022-05-13 01:57:46.034000             🧑  作者: Mango

将整个链表插入 other 在第 k 个位置

给定两个链表和一个数字 k。将第二个链表插入到第 k 个位置的第一个

例子:

Input : a : 1->2->3->4->5->NULL
        b : 7->8->9->10->11->NULL
        k = 2
Output :1->2->7->8->9->10->11->3->4->5->NULL

Input : a: 10->15->20->NULL
        b: 11->17->16->18->NULL
        k = 3
Output : 10->15->20->11->17->16->18->NULL

问题的图示

1) 遍历第一个链表直到第 k 个点
2) 将第二个链表头节点加入到第一个链表的第k个点
3) 遍历第二个链表直到结束
4) 将第一个链表的第(k+1)点添加到第二个链表的末尾



C++
// A C++ program to insert a linked list in
// to another linked list at position k
#include 
using namespace std;
 
/* Structure for a linked list node */
struct Node {
    int data;
    struct Node* next;
};
 
// Function to insert whole linked list in
// to another linked list at position k
void insert(struct Node* head1, struct Node* head2,
            int k)
{
    // traverse the first linked list until k-th
    // point is reached
    int count = 1;
    struct Node* curr = head1;
    while (count < k) {
        curr = curr->next;
        count++;
    }
 
    // backup next node of the k-th point
    struct Node* temp = curr->next;
 
    // join second linked list at the kth point
    curr->next = head2;
 
    // traverse the second linked list till end
    while (head2->next != NULL)
        head2 = head2->next;
 
    // join the second part of the linked list
    // to the end
    head2->next = temp;
}
 
// Function to print linked list recursively
void printList(Node* head)
{
    if (head == NULL)
        return;
 
    // If head is not NULL, print current node
    // and recur for remaining list
    cout << head->data << " ";
    printList(head->next);
}
 
/* Given a reference (pointer to pointer) to the head
  of a list and an int, insert a new node on the front
  of the list. */
void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node = new Node;
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
 
/* Driven program to test above function */
int main()
{
    /* The constructed linked lists are :
     a: 1->2->3->4->5;
     b: 7->8->9->10->11 */
    struct Node* a = NULL;
    struct Node* b = NULL;
    int k = 2;
 
    // first linked list
    push(&a, 5);
    push(&a, 4);
    push(&a, 3);
    push(&a, 2);
    push(&a, 1);
 
    // second linked list
    push(&b, 11);
    push(&b, 10);
    push(&b, 9);
    push(&b, 8);
    push(&b, 7);
 
    printList(a);
    cout << "\n";
 
    printList(b);
 
    insert(a, b, k);
 
    cout << "\nResulting linked list\t";
    printList(a);
 
    return 0;
}


Java
// A Java program to insert a linked list in
// to another linked list at position k
class GFG {
 
    // Structure for a linked list node /
    static class Node {
        int data;
        Node next;
    };
 
    // Function to insert whole linked list in
    // to another linked list at position k
    static Node insert(Node head1, Node head2,
                       int k)
    {
        // traverse the first linked list until k-th
        // point is reached
        int count = 1;
        Node curr = head1;
        while (count < k) {
            curr = curr.next;
            count++;
        }
 
        // backup next node of the k-th point
        Node temp = curr.next;
 
        // join second linked list at the kth point
        curr.next = head2;
 
        // traverse the second linked list till end
        while (head2.next != null)
            head2 = head2.next;
 
        // join the second part of the linked list
        // to the end
        head2.next = temp;
        return head1;
    }
 
    // Function to print linked list recursively
    static void printList(Node head)
    {
        if (head == null)
            return;
 
        // If head is not null, print current node
        // and recur for remaining list
        System.out.print(head.data + " ");
        printList(head.next);
    }
 
    // Given a reference (pointer to pointer) to the head
    // of a list and an int, insert a new node on the front
    // of the list.
    static Node push(Node head_ref, int new_data)
    {
        Node new_node = new Node();
        new_node.data = new_data;
        new_node.next = (head_ref);
        (head_ref) = new_node;
        return head_ref;
    }
 
    // Driven code
    public static void main(String args[])
    {
        // The constructed linked lists are :
        // a: 1.2.3.4.5;
        // b: 7.8.9.10.11
        Node a = null;
        Node b = null;
        int k = 2;
 
        // first linked list
        a = push(a, 5);
        a = push(a, 4);
        a = push(a, 3);
        a = push(a, 2);
        a = push(a, 1);
 
        // second linked list
        b = push(b, 11);
        b = push(b, 10);
        b = push(b, 9);
        b = push(b, 8);
        b = push(b, 7);
 
        printList(a);
        System.out.println();
 
        printList(b);
 
        a = insert(a, b, k);
 
        System.out.print("\nResulting linked list\t");
        printList(a);
    }
}
 
// This code is contributed by Arnab Kundu


Python3
# A Python3 program to insert a linked list in
# to another linked list at position k
 
# Node of the single linked list
class Node:
     
    def __init__(self, data):
        self.data = data
        self.next = None
 
# Function to insert whole linked list in
# to another linked list at position k
def insert(head1, head2, k):
 
    # traverse the first linked list until k-th
    # point is reached
    count = 1
    curr = head1
    while (count < k):
        curr = curr.next
        count += 1
 
    # backup next node of the k-th point
    temp = curr.next
 
    # join second linked list at the kth point
    curr.next = head2
 
    # traverse the second linked list till end
    while (head2.next != None):
        head2 = head2.next
 
    # join the second part of the linked list
    # to the end
    head2.next = temp
    return head1
 
# Function to print linked list recursively
def printList(head):
 
    if (head == None):
        return
 
    # If head is not None, print current node
    # and recur for remaining list
    print( head.data, end = " ")
    printList(head.next)
 
""" Given a reference (pointer to pointer) to the head
of a list and an int, insert a new node on the front
of the list. """
def push(head_ref, new_data):
 
    new_node = Node(0)
    new_node.data = new_data
    new_node.next = (head_ref)
    (head_ref) = new_node
    return head_ref
 
# Driver Code
if __name__ == "__main__":
 
    """ The constructed linked lists are :
    a: 1.2.3.4.5
    b: 7.8.9.10.11 """
    a = None
    b = None
    k = 2
 
    # first linked list
    a = push(a, 5)
    a = push(a, 4)
    a = push(a, 3)
    a = push(a, 2)
    a = push(a, 1)
 
    # second linked list
    b = push(b, 11)
    b = push(b, 10)
    b = push(b, 9)
    b = push(b, 8)
    b = push(b, 7)
 
    printList(a)
    print()
 
    printList(b)
 
    a = insert(a, b, k)
 
    print("\nResulting linked list\t", end = " ");
    printList(a)
 
# This code is contributed by Arnab Kundu


C#
// A C# program to insert a linked list in
// to another linked list at position k
using System;
 
class GFG {
 
    // Structure for a linked list node /
    public class Node {
        public int data;
        public Node next;
    };
 
    // Function to insert whole linked list in
    // to another linked list at position k
    static Node insert(Node head1, Node head2,
                       int k)
    {
        // traverse the first linked list until k-th
        // point is reached
        int count = 1;
        Node curr = head1;
        while (count < k) {
            curr = curr.next;
            count++;
        }
 
        // backup next node of the k-th point
        Node temp = curr.next;
 
        // join second linked list at the kth point
        curr.next = head2;
 
        // traverse the second linked list till end
        while (head2.next != null)
            head2 = head2.next;
 
        // join the second part of the linked list
        // to the end
        head2.next = temp;
        return head1;
    }
 
    // Function to print linked list recursively
    static void printList(Node head)
    {
        if (head == null)
            return;
 
        // If head is not null, print current node
        // and recur for remaining list
        Console.Write(head.data + " ");
        printList(head.next);
    }
 
    // Given a reference (pointer to pointer) to the head
    // of a list and an int, insert a new node on the front
    // of the list.
    static Node push(Node head_ref, int new_data)
    {
        Node new_node = new Node();
        new_node.data = new_data;
        new_node.next = (head_ref);
        (head_ref) = new_node;
        return head_ref;
    }
 
    // Driven code
    public static void Main(String[] args)
    {
        // The constructed linked lists are :
        // a: 1.2.3.4.5;
        // b: 7.8.9.10.11
        Node a = null;
        Node b = null;
        int k = 2;
 
        // first linked list
        a = push(a, 5);
        a = push(a, 4);
        a = push(a, 3);
        a = push(a, 2);
        a = push(a, 1);
 
        // second linked list
        b = push(b, 11);
        b = push(b, 10);
        b = push(b, 9);
        b = push(b, 8);
        b = push(b, 7);
 
        printList(a);
        Console.WriteLine();
 
        printList(b);
 
        a = insert(a, b, k);
 
        Console.Write("\nResulting linked list\t");
        printList(a);
    }
}
 
// This code contributed by Rajput-Ji


Javascript


输出:

1 2 3 4 5 
7 8 9 10 11 
Resulting linked list    1 2 7 8 9 10 11 3 4 5 

https://youtu.be/lOQ

-hZLje2s?list=PLqM7alHXFySH41ZxzrPNj2pAYPOI8ITe7

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程