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(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL && pHead2 == NULL)
return NULL;
if(pHead1 == NULL)
return pHead2;
if(pHead2 == NULL)
return pHead1;
//使用一个空的头结点,emptyHead的next指向新链表的头结点,
//避免一开始取较小值作头结点
ListNode emptyHead(0);
ListNode* p = &emptyHead;
//遍历合并
while(pHead1 != NULL && pHead2 != NULL)
{
if(pHead1->val < pHead2->val)
{
p->next = pHead1;
pHead1 = pHead1->next;
p = p->next;
}
else
{
p->next = pHead2;
pHead2 = pHead2->next;
p = p->next;
}
}
//处理没有合并的节点
if(pHead1 != NULL)
p->next = pHead1;
if(pHead2 != NULL)
p->next = pHead2;
return emptyHead.next;
}
方法二:
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;
}