1.题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
2.分析
此题我们见得比较多。
方法一:一种是常规方法,就是先找一个头结点(链表a,链表b中头结点中值更小的节点),之后一直比较链表a,链表b中更小的节点,把小的节点,加到链表c(合并节点)中,最后把没有添加完的链表,添加到节点后面。
方法二:递归的方法
(a)
1 3 5 7
2 4 6 8
-------
(b)
3 5 7
1
2 4 6 8
-------
(c)
3 5 7
1 2
4 6 8
- 链表1中头结点小于链表2中头结点,因此链表1的头结点是合并之后的头结点
- 剩余节点中,链表1中头结点大于链表2中头结点,所以链表2的头结点是剩余节点的头结点
3.源代码
方法一:
ListNode* Merge_1(ListNode* pHead1, ListNode* pHead2)
{
printf("myMerge:\n");
if(pHead1 == nullptr)
return pHead2;
else if(pHead2 == nullptr)
return pHead1;
ListNode* pMergeHead = nullptr;
//查找头结点
if(pHead1->m_nValue < pHead2->m_nValue)
{
pMergeHead = pHead1;
pHead1 = pHead1->m_pNext;
}
else
{
pMergeHead = pHead2;
pHead2 = pHead2->m_pNext;
}
ListNode* pNode = pMergeHead;
while(pHead1 != nullptr && pHead2 != nullptr)
{
if(pHead1->m_nValue < pHead2->m_nValue)
{
pNode->m_pNext = pHead1;
pNode = pHead1;
pHead1 = pHead1->m_pNext;
}
else
{
pNode->m_pNext = pHead2;
pNode = pHead2;
pHead2 = pHead2->m_pNext;
}
}
if(pHead1 != nullptr)
pNode->m_pNext = pHead1;
else
pNode->m_pNext = pHead2;
return pMergeHead;
}
方法二:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == nullptr)
return pHead2;
else if(pHead2 == nullptr)
return pHead1;
ListNode* pMergeHead = nullptr;
if(pHead1->m_nValue <= pHead2->m_nValue)
{
pMergeHead = pHead1;
pMergeHead->m_pNext = Merge(pHead1->m_pNext,pHead2);
}
else
{
pMergeHead = pHead2;
pMergeHead->m_pNext = Merge(pHead1,pHead2->m_pNext);
}
return pMergeHead;
}