第25题:合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
测试用例
// list1: 1->3->5
// list2: 2->4->6
void Test1()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode5 = CreateListNode(5);
ConnectListNodes(pNode1, pNode3);
ConnectListNodes(pNode3, pNode5);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode6 = CreateListNode(6);
ConnectListNodes(pNode2, pNode4);
ConnectListNodes(pNode4, pNode6);
ListNode* pMergedHead = Test("Test1", pNode1, pNode2);
DestroyList(pMergedHead);
}
// 两个链表中有重复的数字
// list1: 1->3->5
// list2: 1->3->5
void Test2()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode5 = CreateListNode(5);
ConnectListNodes(pNode1, pNode3);
ConnectListNodes(pNode3, pNode5);
ListNode* pNode2 = CreateListNode(1);
ListNode* pNode4 = CreateListNode(3);
ListNode* pNode6 = CreateListNode(5);
ConnectListNodes(pNode2, pNode4);
ConnectListNodes(pNode4, pNode6);
ListNode* pMergedHead = Test("Test2", pNode1, pNode2);
DestroyList(pMergedHead);
}
// 两个链表都只有一个数字
// list1: 1
// list2: 2
void Test3()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pMergedHead = Test("Test3", pNode1, pNode2);
DestroyList(pMergedHead);
}
// 一个链表为空链表
// list1: 1->3->5
// list2: 空链表
void Test4()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode5 = CreateListNode(5);
ConnectListNodes(pNode1, pNode3);
ConnectListNodes(pNode3, pNode5);
ListNode* pMergedHead = Test("Test4", pNode1, nullptr);
DestroyList(pMergedHead);
}
// 两个链表都为空链表
// list1: 空链表
// list2: 空链表
void Test5()
{
ListNode* pMergedHead = Test("Test5", nullptr, nullptr);
}
考点
1.鲁棒性
2.递归:从后往前
3.链表 指针
思路
1.递归结束:如果有一个链表是空,返回另一个链表
2.递归操作:将剩下两个链表最小的头节点作为合并后的头节点;并将 合并后的头节点的下个节点 设置为 剩下链表合并后的头节点。
4.递归返回:合并后的头节点
第一遍
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
//1.如果有一个是空链表,返回另外一个
if (!pHead1)
return pHead2;
else if (!pHead2)
return pHead1;
//2.定义新链表的头指针
ListNode* MergeNode = nullptr;
//3.比较两个链表的头节点大小,进行递归
if (pHead1->m_nValue < pHead2->m_nValue)
{
//3.1如果链表1的节点小,拿出来,MergeNode->m_pNext进行递归
MergeNode = pHead1;
MergeNode->m_pNext = Merge(pHead1->m_pNext, pHead2);
}
else
{
//3.2如果链表2的节点小,拿出来
MergeNode = pHead2;
MergeNode->m_pNext = Merge(pHead1, pHead2->m_pNext);
}
//4.返回合并后的链表头指针
return MergeNode;
}
第二遍
/*
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)
return pHead2;
else if(!pHead2)
return pHead1;
ListNode* MergeNode=nullptr;
if(pHead1->val<pHead2->val)
{
//剩下的两个链表合并后的头节点
MergeNode=pHead1;
//将头节点的下一个节点 设置为 剩下两个链表合并的头节点,递归
MergeNode->next=Merge(pHead1->next,pHead2);
}
else
{
MergeNode=pHead2;
MergeNode->next=Merge(pHead1,pHead2->next);
}
return MergeNode;
}
};