题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
思路:每次从两个链表中选取较小的结点作为新链表的结点,那么这里有两种方法,循环或者递归。(1)循环,每次取出两个链表中较小的结点插入新链表,到达其中一个链表的尾结点时,另外一个链表的其余部分直接接在这个尾结点上。(2)从两个链表中选取较小的表头作为新链表的表头,那么剩下的问题就是两个新的已排序的链表的合并,只不过其中一个链表的表头已经后移了一个结点。这两个新链表的合并步骤和之前的是一样的,这就是典型的递归过程。
//合并两个已排序的链表,非递归
ListNode* MergeSortedList(ListNode* pListHead1, ListNode* pListHead2)
{
if(pListHead1 == NULL)
return pListHead2;
else if(pListHead2 == NULL)
return pListHead1;
else
{
ListNode* pNode1 = pListHead1;
ListNode* pNode2 = pListHead2;
ListNode* pLastNode = NULL;
ListNode* NewHead = NULL;
if(pListHead1->m_nValue < pListHead2->m_nValue)
{
NewHead = pListHead1;
pNode1 = pNode1->m_pNext;
}
else
{
NewHead = pListHead2;
pNode2 = pNode2->m_pNext;
}
pLastNode = NewHead;
if (pNode1 == NULL)
pLastNode->m_pNext = pNode2;
if (pNode2 == NULL)
pLastNode->m_pNext = pNode1;
while (pNode1 != NULL && pNode2 != NULL)
{
if (pNode1->m_nValue < pNode2->m_nValue)
{
pLastNode->m_pNext = pNode1;
pLastNode = pNode1;
pNode1 = pNode1->m_pNext;
}
else
{
pLastNode->m_pNext = pNode2;
pLastNode = pNode2;
pNode2 = pNode2->m_pNext;
}
if (pNode1 == NULL)
pLastNode->m_pNext = pNode2;
if (pNode2 == NULL)
pLastNode->m_pNext = pNode1;
}
return NewHead;
}
}
递归版本:
//合并两个已排序的链表,递归版本
ListNode* MergeSortedList(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL)
return pHead2;
if(pHead2 == NULL)
return pHead1;
ListNode* pMergedHead = NULL;
if(pHead1->m_nValue < pHead2->m_nValue)
{
pMergedHead = pHead1;
pMergedHead->m_pNext = MergeSortedList(pHead1->m_pNext, pHead2);
}
else
{
pMergedHead = pHead2;
pMergedHead->m_pNext = MergeSortedList(pHead2->m_pNext, pHead1);
}
return pMergedHead;
}