更多剑指offer面试习题请点击:《剑指offer》(第二版)题集目录索引
1. 题目
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
2. 递归解法
ListNode* MergeR(ListNode* pHead1, ListNode* pHead2)
{
if (pHead1 == nullptr)
return pHead2;
else if (pHead2 == nullptr)
return pHead1;
ListNode* pMergedHead = nullptr;
if (pHead1->m_nValue < pHead2->m_nValue)
{
pMergedHead = pHead1;
pMergedHead->m_pNext = MergeR(pHead1->m_pNext, pHead2);
}
else
{
pMergedHead = pHead2;
pMergedHead->m_pNext = MergeR(pHead2->m_pNext, pHead1);
}
return pMergedHead;
}
3. 非递归解法
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if (pHead1 == nullptr)
return pHead2;
else if (pHead2 == nullptr)
return pHead1;
ListNode* pMergedHead = nullptr;
ListNode* pTail = nullptr;
if (pHead1->m_nValue < pHead2->m_nValue)
{
pMergedHead = pHead1;
pHead1 = pHead1->m_pNext;
}
else
{
pMergedHead = pHead2;
pHead2 = pHead2->m_pNext;
}
pTail = pMergedHead;
while (pHead1 != nullptr && pHead2 != nullptr)
{
if (pHead1->m_nValue < pHead2->m_nValue)
{
pTail->m_pNext = pHead1;
pHead1 = pHead1->m_pNext;
}
else
{
pTail->m_pNext = pHead2;
pHead2 = pHead2->m_pNext;
}
pTail = pTail->m_pNext;
}
if (pHead1 != nullptr)
{
pTail->m_pNext = pHead1;
}
else if (pHead2 != nullptr)
{
pTail->m_pNext = pHead2;
}
return pMergedHead;
}