【連結串列面試題】合併兩個有序連結串列, 合併後依然有序
阿新 • • 發佈:2019-01-06
程式碼
// 合併兩個有序連結串列
SListNode * MergeOrderedList(SListNode *p1First, SListNode *p2First)
{
SListNode*cur1 = p1First;
SListNode*cur2 = p2First;
SListNode*result = NULL;//結果連結串列
SListNode*tail = NULL;//結果連結串列中的最後一個結點,方便尾插
SListNode*next;//儲存遍歷過程中的下一個結點
while (cur1 != NULL && cur2 != NULL)
{
if (cur1->data <= cur2->data)
{
//應該取連結串列1的結點
if (result != NULL)
{
//結果連結串列不為空,直接在最後一個結點上做插入
//儲存連結串列1的下一個結點,讓迴圈繼續
next = cur1->Next;
//插入過程
tail->Next = cur1;
cur1->Next = NULL;
//儲存新的最後一個結點
tail = cur1;
cur1 = next;
}
else {
//儲存連結串列1的下一個結點,讓迴圈繼續
next = cur1->Next;
result = cur1;
cur1->Next = NULL;
//儲存新的最後一個結點
tail = cur1;
cur1 = next;
}
}
else
{
//應該取連結串列2的結點
if (result != NULL)
{
//結果連結串列不為空,直接在最後一個結點上做插入
//儲存連結串列2的下一個結點,讓迴圈繼續
next = cur2->Next;
//插入過程
tail->Next = cur2;
cur2-> Next = NULL;
//儲存新的最後一個結點
tail = cur2;
cur2 = next;
}
else {
//儲存連結串列1的下一個結點,讓迴圈繼續
next = cur2->Next;
result = cur2;
cur2->Next = NULL;
//儲存新的最後一個結點
tail = cur2;
cur2 = next;
}
}
}
//一個連結串列為空了
if (cur1 == NULL)
{
tail->Next = cur2;
}
if (cur2 == NULL)
{
tail->Next = cur1;
}
return result;
}
測試用例
void TestMerge()
{
SListNode*List1 = NULL, *List2 = NULL;
SListPushBack(&List1, 1);
SListPushBack(&List1, 1);
SListPushBack(&List1, 3);
SListPushBack(&List1, 4);
SListPushBack(&List1, 6);
SListPushBack(&List2, 1);
SListPushBack(&List2, 2);
SListPushBack(&List2, 3);
SListNode*result = MergeOrderedList(List1, List2);
SListPrint(result);
}
結果
版本優化
// 合併兩個有序連結串列
SListNode * MergeOrderedList(SListNode *p1First, SListNode *p2First)
{
SListNode*cur1 = p1First;
SListNode*cur2 = p2First;
SListNode*result = NULL;//結果連結串列
SListNode*tail = NULL;//結果連結串列中的最後一個結點,方便尾插
SListNode*next;//儲存遍歷過程中的下一個結點
SListNode*node;
while (cur1 != NULL && cur2 != NULL)
{
if(cur1->data<=cur2->data)
{
node = cur1;
}
else
{
node = cur2;
}
//應該取連結串列1的結點
//儲存連結串列1的下一個結點,讓迴圈繼續
next = node->Next;
if (result != NULL)
{
//結果連結串列不為空,直接在最後一個結點上做插入
//插入過程
tail->Next = node;
}
else {
//儲存連結串列1的下一個結點,讓迴圈繼續
result = node;
}
node->Next = NULL;
//儲存新的最後一個結點
tail = node;
if (node == cur1)
{
cur1 = next;
}
else
{
cur2 = next;
}
node = next;
}
//一個連結串列為空了
if (cur1 == NULL)
{
tail->Next = cur2;
}
if (cur2 == NULL)
{
tail->Next = cur1;
}
return result;
}