将一个升序排列的单链表和一个降序排列的单链表合并成一个升序排列的单链表(优酷土豆2014校园招聘笔试题)

这篇博客讨论了如何将一个升序排列的单链表和一个降序排列的单链表合并成一个升序排列的单链表。首先通过反转降序链表使其变为升序,然后使用递归方法比较两个升序链表的头节点,依次合并成新的升序链表。文章详细阐述了链表反转和两链表合并的具体步骤和实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:首先可以将降序排列的单链表反转,这样两个链表均为升序,再将两个升序排列的单链表合并成一个升序排列的单链表。于是这里我们需要解决两个问题:

Q1:如何将一个单链表反转?

A1:以一般情况为例,下图(a)是一个单链表,图(b)是对图(a)已经实现若干结点反转的单链表,下一步我们需要对结点i进行反转,我们发现反转结点i之前,需要保存结点i所指的下一个结点j,否则在对结点i反转完成后,链表发生断裂,我们无法再寻找到结点j,也就无法进行后续的反转,同时在反转之前,我们还需要直到当前反转结点i的上一结点h,以让i结点指向h结点。因此,这里我们需要三个链表指针,分别保存当前要反转的结点(不妨设为pCurrentNode),当前要反转的结点的前一结点(不妨设为pPreNode),当前要反转的结点的后一结点(不妨设为pNextNode),对当前结点i反转完成后,我们将pPreNode设为当前结点i,将当前结点pCurrentNode指向要反转的下一结点j,pNextNode指向结点k,重复执行上述过程,直到当前结点pCurrentNode为空,即完成整个链表的反转。

 

Q2:如何将两个升序排列的单链表(设为pList1和pList2)合成一个升序排列的单链表(设为pMergeList)?

A2:对于两个升序排列的单链表pList1和pList2,我们可以先比较两个链表的头结点,将头结点值小的(假如是pList1)作为加入合并后的链表的末尾,然后将pList1的第二个结点作为头结点,同样对上述两个链表的头结点进行比较,重复上述同样的操作。对于多次重复的操作我们可以用递归完成。这里我们需要注意:如果两个要合并的链表其中一个为空(假设为pList1),则合并后的结果为另一个链表p

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值