代码
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)
{
if (result != NULL)
{
next = cur1->Next;
tail->Next = cur1;
cur1->Next = NULL;
tail = cur1;
cur1 = next;
}
else {
next = cur1->Next;
result = cur1;
cur1->Next = NULL;
tail = cur1;
cur1 = next;
}
}
else
{
if (result != NULL)
{
next = cur2->Next;
tail->Next = cur2;
cur2->Next = NULL;
tail = cur2;
cur2 = next;
}
else {
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;
}
next = node->Next;
if (result != NULL)
{
tail->Next = node;
}
else {
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;
}