【剑指Offer-代码的鲁棒性】面试题25:合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路1
可以使用循环来做。首先要确定合并后链表的头。如果第一个链表为空,则合并后的链表就是第二个链表;同样地,如果第二个链表为空,则合并后的链表就是第一个链表;如果两个链表均不为空,则合并后的链表头为两个链表头结点中值较小的那个。确定表头后,可以对两个链表进行遍历:设cur1为第一个链表的当前结点,cur2为第二个链表的当前结点,如果cur1->val>cur2<val,则将cur2加入到链表中; 否则将cur1加入到链表中。直至两个链表都遍历结束。代码如下:
/*
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 && pHead2==nullptr)
return nullptr;
ListNode* pHead3; //合并后的链表头
ListNode* cur1 = pHead1;
ListNode* cur2 = pHead2;
if(cur1!=nullptr&&cur2!=nullptr) //确定pHead3
{
if(cur1->val>cur2->val)
{
pHead3 = cur2;
cur2 = cur2->next;
}
else if(cur1->val<cur2->val)
{
pHead3 = cur1;
cur1 = cur1->next;
}
else
{
pHead3 = cur1;
cur1 = cur1->next;
}
}
else if(cur1==nullptr&&cur2!=nullptr)
{
pHead3 = cur2;
cur2 = cur2->next;
}
else if(cur1!=nullptr&&cur2==nullptr)
{
pHead3 = cur1;
cur1 = cur1->next;
}
ListNode* cur = pHead3;
while(cur1!=nullptr||cur2!=nullptr) //合并两个链表
{
if(cur1!=nullptr&&cur2!=nullptr)
{
if(cur1->val>cur2->val)
{
cur->next = cur2;
cur = cur->next;
cur2 = cur2->next;
}
else if(cur1->val<cur2->val)
{
cur->next = cur1;
cur = cur->next;
cur1 = cur1->next;
}
else
{
cur->next = cur1;
cur = cur->next;
cur1 = cur1->next;
}
}
else if(cur1==nullptr&&cur2!=nullptr)
{
while(cur2!=nullptr)
{
cur->next = cur2;
cur = cur->next;
cur2 = cur2->next;
}
}
else if(cur1!=nullptr&&cur2==nullptr)
{
while(cur1!=nullptr)
{
cur->next = cur1;
cur = cur->next;
cur1 = cur1->next;
}
}
}
return pHead3;
}
};
思路2
由于每次合并的步骤是一样的,所以可以使用递归来做。代码如下:
/*
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 && pHead2==nullptr)
return nullptr;
if(pHead1==nullptr)
return pHead2;
if(pHead2==nullptr)
return pHead1;
if(pHead1->val>pHead2->val)
{
pHead2->next = Merge(pHead1, pHead2->next);
return pHead2;
}
else
{
pHead1->next = Merge(pHead1->next, pHead2);
return pHead1;
}
}
};