链表面试题2:输入两个递增排序的链表,合并这两个链表并使新链表的结点仍然是按照递增排序的。
-
分析题目:根据题目可模拟画出如下示意图,须将链表1和链表2合并并排序为链表3
-
解题思路:
-
1、先找出链表1和链表二中较小的头结点,作为链表3的头结点
-
2、使链表3的头结点指向剩余链表中较小的头结点
-
3、重复找到剩余链表中较小结点,连向链表3
-
4、这一过程可以使用递归来做
-
每次传参传合并链表的尾结点和剩余链表中较小的结点
-
递归的截至条件是其中一条链表剩余结点为空
-
-
-
图解:
- 代码实现
//定义结点的结构体
struct MergeList
{
int value;
struct MergeList* pNext;
};
MergeList* Merge(MergeList* pHead1, MergeList* pHead2)
{
//当链表1或链表2的头结点为空时
if (pHead1 == NULL)
return pHead2;
if (pHead2 == NULL)
return pHead1;
//分情况使用两种不同参数的递归
MergeList* pMerged = NULL;
//剩余链表1的头结点比剩余链表2的头结点小
if (pHead1->value < pHead2->value)
{
pMerged = pHead1;
pMerged->pNext = Merge(pHead1->pNext, pHead2);
}
//剩余链表1头结点比剩余链表2的头结点大
else
{
pMerged = pHead2;
pMerged->pNext = Merge(pHead1,pHead2->pNext);
}
return pMerged;
}
-
注意事项:
-
当两个链表均为空或任一为空时如何处理
-
两个链表中存在相等结点的情况程序是否正确
-
递归的截至条件是其中一条链表剩余结点为空
-