c 面试题之合并两个排序的链表



 c 面试题之合并两个排序的链表。输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然递增排序。链表结点定义如下:

struct ListNode
{
    int m_nValue;
    ListNode* m_pNext;
};

先分析一下合并过程。假设链表1的头结点的值小于链表2的头结点的值,则链表1的头结点作为合并后的链表的头结点。然后继续合并两个链表中剩余的结点。两个链表中剩下的结点依然是排序的,所以合并这两个链表的步骤和前面的步骤一样。这是典型的递归过程,可以定义递归函数来完成这一合并过程。

参考代码实例:

ListNode* Merge(ListNode *pHead1, ListNode *pHead2)
{
if (pHead1 == NULL)
return pHead2;

else if (pHead2 == NULL)
return pHead1;

ListNode *pMergedHead = NULL;

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;
}为了代码的鲁棒性,应该尽可能的进行单元测试。例如本题可以想到的测试用例:(1)功能测试(输入的两个链表有多个结点,结点的值互不相同或者存在值相等的多个点);(2)特殊输入测试(两个链表的一个或两个头结点为NULL指针、两个链表中只有一个结点)。