实验思路:
- 将两条值递增顺序的链表进行值递增的顺序合并。
- 将合并的链表进行倒置。
核心代码:
1.倒置:
Node *daoxue(Node *head)//放入需要倒序的链表(无头结点)
{
Node* head2=new Node;
head2->next = nullptr;
Node* p, * s;
s= head;
p = head->next;
while (p)
{
s->next = head2->next;
head2->next = s;
s = p;
p = p->next;
if(p==nullptr)
{
s->next = head2->next;
head2->next = s;
}
}
Node* second = head2->next;
delete head2;
return second;
}
2.合并:
Node *mergeTwolists(Node *l1,Node *l2 )//输入和返回无头结点的链表
{
if(l1==nullptr) return l2;
if(l2==nullptr) return l1;
Node *head=(l1->date<=l2->date)?l1:l2;
Node *tail=head;
l1=(head==l1)?l1->next:l1;
l2=(head==l2)?l2->next:l2;
while(l1!=nullptr && l2!=nullptr)
{
if(l1->date<=l2->date)
{
tail->next=l1;
l1=l1->next;
}
else
{
tail->next=l2;
l2=l2->next;
}
tail=tail->next;
}
tail->next=(l1==nullptr)?l2:l1;
return head;
}
全部代码:
#include<iostream>
using namespace std;
struct Node{
int date;
Node* next = nullptr;
};
Node *daoxue(Node *head)//放入需要倒序的链表(无头结点)
{
Node* head2=new Node;
head2->next = nullptr;
Node* p, * s;
s= head;
p = head->next;
while (p)
{
s->next = head2->next;
head2->next = s;
s = p;
p = p->next;
if(p==nullptr)
{
s->next = head2->next;
head2->next = s;
}
}
Node* second = head2->next;
delete head2;
return second;
}
Node *mergeTwolists(Node *l1,Node *l2 )//输入和返回无头结点的链表
{
if(l1==nullptr) return l2;
if(l2==nullptr) return l1;
Node *head=(l1->date<=l2->date)?l1:l2;
Node *tail=head;
l1=(head==l1)?l1->next:l1;
l2=(head==l2)?l2->next:l2;
while(l1!=nullptr && l2!=nullptr)
{
if(l1->date<=l2->date)
{
tail->next=l1;
l1=l1->next;
}
else
{
tail->next=l2;
l2=l2->next;
}
tail=tail->next;
}
tail->next=(l1==nullptr)?l2:l1;
return head;
}
int main()
{
//第一条链
Node *L1=new Node;
Node *re1=L1;
int a[12];
for (int i = 0; i < 12; ++i)
a[i] = (i+1)*2 ;
for (int i = 0; i < 12; ++i)
{
Node *s1=new Node;
s1->date=a[i];
s1->next=re1->next;
re1->next=s1;
re1=s1;
}
//第二条链
Node *L2=new Node;
Node *re2=L2;
int b[12];
for (int i = 0; i < 12; ++i)
b[i] = i * 2+1;
for (int i = 0; i < 12; ++i)
{
Node *s2=new Node;
s2->date=b[i];
s2->next=re2->next;
re2->next=s2;
re2=s2;
}
Node* x1 = L1->next;
if (x1 != nullptr)
{
cout << "初始数据为:" << endl;
while (x1 != nullptr)
{
cout << " " << x1->date;
x1 = x1->next;
}
cout << endl;
}
else
cout << "表中无数据" << endl;
Node* x2 = L2->next;
if (x2 != nullptr)
{
cout << "初始数据为:" << endl;
while (x2 != nullptr)
{
cout << " " << x2->date;
x2 = x2->next;
}
cout << endl;
}
else
cout << "表中无数据" << endl;
Node *t1=mergeTwolists(L1->next,L2->next);
Node *t2=daoxue(t1);
if (t2 != nullptr)
{
cout << "变化后的数据为:" << endl;
while (t2 != nullptr)
{
cout << " " << t2->date;
t2 = t2->next;
}
cout << endl;
}
else
cout << "表中无数据" << endl;
Node* p1 = t2;
while (p1)
{
Node* q1 = p1;
p1 = p1->next;
delete q1;//从头开始删除
}
}
运行结果: