剣指offer-面接問題17:2つのソートされたチェーンテーブルをマージ
2530 ワード
タイトル:2つのインクリメンタルソートのチェーンテーブルを入力し、この2つのチェーンテーブルをマージし、新しいチェーンテーブルのノードをインクリメンタルソートします.
考え方:2つのチェーンテーブルから新しいチェーンテーブルのノードとして小さいノードを選択するたびに、ここには2つの方法があり、ループまたは再帰があります.(1)ループは,2つのチェーンテーブルのうち小さいノードを取り出すたびに新しいチェーンテーブルに挿入し,そのうちの1つのチェーンテーブルの末尾ノードに達すると,もう1つのチェーンテーブルの残りの部分が直接この末尾ノードに接続される.(2)2つのチェーンテーブルの中から小さいテーブルを新しいチェーンテーブルのヘッダとして選択すると,残りの問題は2つの新しい並べ替えられたチェーンテーブルの結合であり,そのうちの1つのチェーンテーブルのヘッダが1つのノードを後方に移動しただけである.この2つの新しいチェーンテーブルのマージ手順は、従来と同様であり、典型的な再帰プロセスである.
考え方:2つのチェーンテーブルから新しいチェーンテーブルのノードとして小さいノードを選択するたびに、ここには2つの方法があり、ループまたは再帰があります.(1)ループは,2つのチェーンテーブルのうち小さいノードを取り出すたびに新しいチェーンテーブルに挿入し,そのうちの1つのチェーンテーブルの末尾ノードに達すると,もう1つのチェーンテーブルの残りの部分が直接この末尾ノードに接続される.(2)2つのチェーンテーブルの中から小さいテーブルを新しいチェーンテーブルのヘッダとして選択すると,残りの問題は2つの新しい並べ替えられたチェーンテーブルの結合であり,そのうちの1つのチェーンテーブルのヘッダが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;
}