题目:将两个升序链表合并为一个新的升序链表并返回(无头结点)。
解题思路:1.三个指针指向三个链表(两个待合并链表和一个合并链表)。2.递归。
ListNode* mergeTwoLists(LinkList& LA, LinkList& LB) {
ListNode* p = new ListNode; //合并后的链表的头结点
ListNode* s = p; //s指针遍历链表LA与LB
while(LA != NULL && LB != NULL){
if(LA->val < LB->val){
s->next = LA;
LA = LA->next;
}else{
s->next = LB;
LB = LB->next;
}
s = s->next;
}
s->next = LA == NULL ? LB : LA; //收尾
//释放开始时创建的头结点
ListNode*temp = p;
p = p->next;
delete temp;
return p; //返回
}
ListNode* mergeTwoLists2(LinkList& LA, LinkList& LB){
if(LA == NULL) return LB;
else if(LB == NULL) return LA;
else if(LA->val < LB->val){
//LA值小于LB值,递归比较LA->next值与LB值
LA->next = mergeTwoLists2(LA->next,LB);
return LA; //返回LA
}else{
//LA值大于LB值,递归比较LA值与LB->next值
LB->next = mergeTwoLists2(LA,LB->next);
return LB; //返回LB
}
}
完整代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef struct node{
int val;
struct node* next;
}ListNode,*LinkList;
ListNode* mergeTwoLists(LinkList& LA, LinkList& LB) {
ListNode* p = new ListNode; //合并后的链表的头结点
ListNode* s = p; //s指针遍历链表LA与LB
while(LA != NULL && LB != NULL){
if(LA->val < LB->val){
s->next = LA;
LA = LA->next;
}else{
s->next = LB;
LB = LB->next;
}
s = s->next;
}
s->next = LA == NULL ? LB : LA; //收尾
//释放开始时创建的头结点
ListNode*temp = p;
p = p->next;
delete temp;
return p; //返回
}
//递归
ListNode* mergeTwoLists2(LinkList& LA, LinkList& LB){
if(LA == NULL) return LB;
else if(LB == NULL) return LA;
else if(LA->val < LB->val){
//LA值小于LB值,递归比较LA->next值与LB值
LA->next = mergeTwoLists2(LA->next,LB);
return LA; //返回LA
}else{
//LA值大于LB值,递归比较LA值与LB->next值
LB->next = mergeTwoLists2(LA,LB->next);
return LB; //返回LB
}
}
//尾插法
ListNode* createListR(int finish){ //约定以finish结束
int x;
cin >> x;
if(x == finish) return NULL; //递归边界
ListNode* p = new ListNode;
p->val = x;
p->next = createListR(finish); //把剩余的创建任务交给下一层
return p;
}
void printList(ListNode* p){
if(p == NULL) return;
cout<<p->val<<" ";
printList(p->next);
}
int main(){
ListNode* p = createListR(9999);
ListNode* q = createListR(9999);
// ListNode* k = mergeTwoLists(p, q);
ListNode* k = mergeTwoLists2(p, q);
cout<<"合并q和p:"<<endl;
printList(k);
}
运行结果:
更多代码请参考:手撕考研数据结构(代码汇总)