题目:已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)
1.循环方法:
核心代码:
pNode Combine(pNode p,pNode node1, pNode node2) //node1 node2是有序的链表的头;将两个有序的链表合并,并保持有序状态
{
pNode p1 = node1;
pNode p2 = node2;
while (NULL != p1 && NULL != p2) //两个都不为空时有三种情况
{
if (p1->Element < p2->Element)
{
InsertEnd(p, p1->Element);
p1 = p1->Next;
}
// Combine(p, p1, p2);
else if (p1->Element > p2->Element)
{
InsertEnd(p, p2->Element);
p2 = p2->Next;
// Combine(p,p1, p2);
}
else
{
InsertEnd(p, p1->Element);
InsertEnd(p, p2->Element);
p1 = p1->Next;
p2 = p2->Next;
// Combine(p,p1, p2);
}
}
while (NULL != p1 && NULL == p2) //有一个为空时将另一个全部插入到合并队列中
{
InsertEnd(p, p1->Element);
p1 = p1->Next;
}
while (NULL == p1 && NULL != p2)
{
InsertEnd(p, p2->Element);
p2 = p2->Next;
}
Display(p);
return p;
}
2.递归的方法
核心代码:
pNode Combine(pNode p,pNode node1, pNode node2)
{
pNode p1 = node1;
pNode p2 = node2;
if (NULL != p1 && NULL != p2)
{
if (p1->Element < p2->Element)
{
InsertEnd(p, p1->Element);
p1 = p1->Next;
Combine(p, p1, p2);
}
else if (p1->Element > p2->Element)
{
InsertEnd(p, p2->Element);
p2 = p2->Next;
Combine(p, p1, p2);
}
else
{
InsertEnd(p, p1->Element);
InsertEnd(p, p2->Element);
p1 = p1->Next;
p2 = p2->Next;
Combine(p, p1, p2);
}
}
else if (NULL != p1 && NULL == p2)
{
InsertEnd(p, p1->Element);
p1 = p1->Next;
Combine(p, p1, p2);
}
else if (NULL == p1 && NULL != p2)
{
InsertEnd(p, p2->Element);
p2 = p2->Next;
Combine(p, p1, p2);
}
// Display(p);
return p;
}