📜  双向链表合并排序的C++程序(1)

📅  最后修改于: 2023-12-03 15:37:05.343000             🧑  作者: Mango

双向链表合并排序的C++程序介绍

双向链表是链表的一种,除了节点有单向指针指向下一个节点外,还有一个指向上一个节点的指针。在此基础上,我们可以实现链表的合并排序,使两个有序链表按照从小到大的顺序合并成一个新的有序链表。

实现思路
  1. 定义一个双向链表的节点结构,包含数据域和前后指针域;
  2. 定义一个合并排序函数,输入两个有序链表的头节点指针,合并后返回合并后的有序链表的头节点指针;
  3. 在合并排序函数中,使用递归的方式将两个链表分别拆成两个有序链表;
  4. 递归到最底层时,将两个有序链表按照从小到大的顺序合并,返回合并后的有序链表的头节点指针;
  5. 将合并后的有序链表连接起来,返回整个链表的头节点指针。
代码实现

此处给出实现代码:

#include<iostream>

using namespace std;

struct Node 
{
    int data;
    Node *pre;
    Node *next;
};

Node *merge(Node *head1, Node *head2) 
{
    if (head1 == NULL)
        return head2;
    if (head2 == NULL) 
        return head1;
    if (head1->data < head2->data) 
    {
        head1->next = merge(head1->next, head2);
        head1->next->pre = head1;
        head1->pre = NULL;
        return head1;
    } 
    else 
    {
        head2->next = merge(head1, head2->next);
        head2->next->pre = head2;
        head2->pre = NULL;
        return head2;
    }
}

int main() 
{
    Node *node1 = new Node;
    Node *node2 = new Node;
    node1->data = 1;
    node1->pre = NULL;
    node1->next = node2;
    node2->data = 2;
    node2->pre = node1;
    node2->next = NULL;
    Node *node3 = new Node;
    Node *node4 = new Node;
    node3->data = 3;
    node3->pre = NULL;
    node3->next = node4;
    node4->data = 4;
    node4->pre = node3;
    node4->next = NULL;
    Node *head = merge(node1, node3);
    while (head != NULL) 
    {
        cout << head->data << ' ';
        head = head->next;
    }
    return 0;
}

在代码中,我们定义了一个节点结构Node,包含了一个数据域和两个指针域,其中一个指向前一个节点,另一个指向后一个节点。然后定义了一个合并排序函数merge,输入两个有序链表的头节点指针,返回合并后的有序链表的头节点指针。

在合并排序函数中,我们首先做了三个判断,分别是当head1为空、当head2为空,和当head1的值小于head2的值时。然后通过递归的方式将两个链表分别拆成两个有序链表,递归到底层时返回链表的头节点指针,并将合并后的有序链表连接起来,返回整个链表的头节点指针。

在主函数中,我们创建了两个有序链表,分别是node1node3,然后调用了merge函数,将两个链表合并成一个新的有序链表。最后打印了合并后的链表。