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

来源:互联网 发布:帝国cms支持视频 编辑:程序博客网 时间:2024/06/08 08:29

问题定义:

      写一个函数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 < l2->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 < l2->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 < l2->data){pNewHead = l1;pNewHead->next = _Merge(l1->next, l2);}else{pNewHead = l2;pNewHead->next = _Merge(l1, l2->next);}return pNewHead;}



0 0