c语言链表笔试题,C语言常见单链表面试题(2)

问题定义:

写一个函数Merge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,Merge的返回值是新的链表。新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素。

比如:这里有两个链表,分别是

list1: 5->10->15

list2: 2->3->20

Merge函数返回一个指向新链表的指针,新链表应该是如下这样的:2->3->5->10->15->20

程序需要考虑如下情况:两个链表(函数参数)都有可能为空,可能连个链表其中一个为空,可能两个链表相等,也可能其中一个链表已经遍历完了,另一个链表还有很多元素,所以需要首先处理特殊情况。

1、非递归实现pLinkNode Merge(pList l1, pList l2)

{

pList pNewHead = NULL;

pLinkNode cur = NULL;

assert(l1);

assert(l2);

if (l1 == l2)//链表相等

{

return l1;

}

if ((l1 == NULL) && (l2 != NULL))//L1为空

{

return l2;

}

if ((l1 != NULL) && (l2 == NULL))//l2为空

{

return l1;

}

if (l1->data data)

{

pNewHead = l1;

l1 = l1->next;

pNewHead->next = NULL;

}

else

{

pNewHead = l2;

l2 = l2->next;

pNewHead->next = NULL;

}

cur = pNewHead;//确定头指针

while ((l1) && (l2))

{

if (l1->data data)

{

cur->next = l1;

l1 = l1->next;

}

else

{

cur->next = l2;

l2 = l2->next;

}

cur = cur->next;

}

if(l1==NULL)

{

cur->next = l2;

}

else

{

cur->next= l1;

}

return pNewHead;

}

2、合并操作是非常适合用递归来完成的一类操作,递归实现将会比迭代实现更加清晰且易于理解。尽管如此,你可能也不愿意使用递归来实现这个操作,因为递归方法所使用的栈空间与链表的长度成正比。

思路:可以将两个有序单链表的合并简化为在两条单链表中一直寻找较小的头节点。但是首先还是要考虑特殊情况pLinkNode _Merge(pList l1, pList l2)

{

pList pNewHead = NULL;

pLinkNode cur = NULL;

assert(l1);

assert(l2);

if (l1 == l2)//链表相等

{

return l1;

}

if ((l1 == NULL) && (l2 != NULL))//L1为空

{

return l2;

}

if ((l1 != NULL) && (l2 == NULL))//l2为空

{

return l1;

}

if (l1->data data)

{

pNewHead = l1;

pNewHead->next = _Merge(l1->next, l2);

}

else

{

pNewHead = l2;

pNewHead->next = _Merge(l1, l2->next);

}

return pNewHead;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值