题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的,如下图所示:
思路 :
这道题让我想起了归并排序,归并排序的通常也是通过递归来实现的,思路不难,就是每次比较链表1,2的头节点,选择值小的那一个作为链表3的节点进行连接,还是要注意过程中链表不能出现断裂,还要处理链表为空的情况,这一点很容易被忽略,切记!
代码:
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
ListNode* Merge(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 = Merge(pHead1->m_pNext, pHead2);
}
else
{
pMergedHead = pHead2;
pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
}
return pMergedHead;
}
复习:
这个代码用递归实现太简洁了,而且前面特殊输入的判定很好。
二刷代码:
ListNode* ReverseList(ListNode* pHead1,ListNode* pHead2)
{
if (pHead1 == nullptr)
return pHead2;
else if (pHead2 == nullptr)
return pHead1;
ListNode* pMergedHead = nullptr;
if (pHead1->m_value > pHead2->m_value)
{
pMergedHead = pHead1;
pMergedHead->m_pNext = ReverseList(pHead1->m_pNext, pHead2);
}
else
{
pMergedHead = pHead2;
pMergedHead->m_pNext = ReverseList(pHead1, pHead2->m_pNext);
}
return pMergedHead;
}