将两个有序链表合并
思路:
1)设定两个指针,分别指向链表1的头和链表2的头;
2)创建新得链表头p;
3)如果p1的值<p2的值,则p1的值为新链表的头节点值,即p=p1->value;
反之,则p2的值为新链表的头节点值,即p=p2->value;
4)对于剩下的链表用同样的方式进行比较,将较小的值拿去新链表并与上个数值链接起来。
5)可以采用递归实现,后面剩余节点的比较
6)特殊情况:当链表1为空时,新得合并链表为链表2;当链表2为空时,新得合并链表为链表1.
#include<iostream>
using namespace std;
struct Node {
int value;
Node* next;
Node(int v) :value(v) {}
};
//创建一个有序链表
Node* CreateList1()
{
Node *head;
Node* n1 = new Node(1);
Node* n3 = new Node(3);
Node* n5 = new Node(5);
Node* n7 = new Node(7);
Node* n9 = new Node(9);
head = n1;
n1->next = n3;
n3->next = n5;
n5->next = n7;
n7->next = n9;
n9->next = NULL;
return head;
}
Node* CreateList2()
{
Node* head;
Node* n2 = new Node(2);
Node* n4 = new Node(4);
Node* n6 = new Node(6);
Node* n8 = new Node(8);
//Node* n10 = new Node(10);
head = n2;
n2->next = n4;
n4->next = n6;
n6->next = n8;
n8->next = NULL;
return head;
}
//释放链表空间
void FreeList(Node *head)
{
if (head == NULL)
{
return;
}
else {
Node* temp = head->next;
delete head;
head = temp;
FreeList(head);
}
}
//递归的方式遍历链表中的元素
void BianList(Node* head)
{
if (head)
{
cout << head->value << "->";
BianList(head->next);
}
else {
cout << "null" << endl;
}
}
Node* ListMerge(Node* head1, Node* head2)
{
if (head1 == nullptr)
{
return head2;
}
else if(head2 == nullptr)
{
return head1;
}
Node* Mergehead = nullptr;
if (head1->value < head2->value)
{
Mergehead = head1;
Mergehead->next = ListMerge(head1->next, head2);
}
else
{
Mergehead = head2;
Mergehead->next = ListMerge(head1, head2->next);
}
return Mergehead;
}
int main()
{
Node* head1 = CreateList1();
Node* head2 = CreateList2();
cout << "合并前输出:" << endl;
cout << "链表1:";
BianList(head1);
cout << "链表2:";
BianList(head2);
cout << "合并后输出:" << endl;
Node * Mergehead=ListMerge(head1, head2);
BianList(Mergehead);
FreeList(Mergehead);
return 0;
}