Q25合并链表 (顺序合并+递归)
题目:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路
直观上并没有特别复杂的地方。但是写起来需要注意nullptr
的影响
1.顺序合并
- 找出两个链表中,首元素较小的链表头重新定义为p1,另一个为p2。
- 当p2的val满足处于[p1, p1+1)内val时,将p2合并至p1后,不然就让P1往前移
- 注意判断p1+1是否为空!!
- 合并时,注意p1, p2的顺序!
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==nullptr)
return pHead2;
if(pHead2==nullptr)
return pHead1;
ListNode* pMerge = pHead1->val <= pHead2->val ? pHead1 : pHead2;
ListNode* p1 = pHead1->val <= pHead2->val ? pHead1 : pHead2;
ListNode* p2 = pHead1->val > pHead2->val ? pHead1 : pHead2;
ListNode* p1Next = nullptr;
ListNode* p2Next = nullptr;
while(p1!=nullptr && p2!=nullptr)
{
p1Next = p1->next;
p2Next = p2->next;
while(p1Next!=nullptr && !(p2->val>=p1->val && p2->val<p1Next->val))
{
p1 = p1Next;
p1Next = p1->next;
}
p1->next = p2;
p2->next = p1Next;
p1=p2;
p2 = p2Next;
}
return pMerge;
}
};
2.递归
写出来代码非常简洁,链表的问题似乎都可以用递归来解决。
- 终止条件,某一个链表为空时,直接返回另一个。
- 当前函数 确定 两个链表中的头元素,
- 该头元素的next 设定为 递归后函数的返回值。
- 递归输入参数为,除当前函数判断出的首节点的其他节点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==nullptr) return pHead2;
if(pHead2==nullptr) return pHead1;
ListNode* mergedHead = nullptr;
if(pHead1->val <= pHead2->val)
{
mergedHead = pHead1;
mergedHead->next = Merge(pHead1->next, pHead2);
}
else
{
mergedHead = pHead2;
mergedHead->next = Merge(pHead2->next, pHead1);
}
return mergedHead;
}
};