AcWing 3639. 链表合并
原题链接
简单
作者:
Spstar.
,
2024-11-25 21:02:11
,
所有人可见
,
阅读 4
链表写法记录
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct ListNode{
int val;
ListNode* next;
ListNode(int _val):val(_val),next(NULL){}
};
void print(ListNode* headA)
{
auto p=headA;
while(p)
{
cout<<p->val<<' ';
p=p->next;
}
}
ListNode* merge(ListNode* headA,ListNode* headB){//A前B后
if (headA == NULL)
return headB;
if (headB == NULL)
return headA;
if(headA->val>headB->val){
auto headC=headA;
headA=headB;
headB=headC;
}
auto p1=headA,p2=headB;
while(p1&&p2){
while(p1->next&&(p2->val>=p1->next->val))//找heada上第一个与headb合并的起点
p1=p1->next;
if(p1->next==NULL){
p1->next=p2;
return headA;
}
auto t=p1->next;
p1->next=p2;
while(p2->next&&(p2->next->val<=t->val))//找headb上第一个与heada合并的起点
p2=p2->next;
if(p2->next==NULL){
p2->next=t;
return headA;
}
auto t2=p2->next;
p2->next=t;
p1=t;
p2=t2;
}
return headA;
}
void DDD(ListNode* head)
{
auto p=head;
while(p)
{
auto t=p;
p=p->next;
delete t;
}
}
int main()
{
int n,m,x;
cin>>n>>x;
ListNode* headA=new ListNode(x);
auto p=headA;
for(int i=0;i<n-1;i++)
{
cin>>x;
auto t=new ListNode(x);
p->next=t;
p=t;
}
cin>>m>>x;
ListNode* headB=new ListNode(x);
p=headB;
for(int i=0;i<m-1;i++)
{
cin>>x;
auto t=new ListNode(x);
p->next=t;
p=t;
}
ListNode* ans=merge(headA,headB);
print(ans);
DDD(headA);
DDD(headB);
DDD(ans);
return 0;
}