📅  最后修改于: 2023-12-03 15:37:05.343000             🧑  作者: Mango
双向链表是链表的一种,除了节点有单向指针指向下一个节点外,还有一个指向上一个节点的指针。在此基础上,我们可以实现链表的合并排序,使两个有序链表按照从小到大的顺序合并成一个新的有序链表。
此处给出实现代码:
#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
的值时。然后通过递归的方式将两个链表分别拆成两个有序链表,递归到底层时返回链表的头节点指针,并将合并后的有序链表连接起来,返回整个链表的头节点指针。
在主函数中,我们创建了两个有序链表,分别是node1
和node3
,然后调用了merge
函数,将两个链表合并成一个新的有序链表。最后打印了合并后的链表。