《剑指offer》面试题25:合并两个排序的链表(C++实现)

《剑指offer》面试题25:合并两个排序的链表(C++实现)

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

解决思路

这道题重在对于问题的分析和理解。
我们函数是得到了两个头节点的指针。

我们需要定义一个合并后的链表头节点,然后比较两个链表头节点的值,其中值更小的节点作为合并链表头节点的下一个节点。

值更大的那个节点与值更小的那个节点的下一节点继续放入函数判断并决定哪一个节点要继续链接到我们的合并链表中。

显然可以用递归进行实现。

思路一:递归实现

//运行时间:4ms
//运行内存:488K
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {    if(pHead1==nullptr)
                return pHead2;
         else if(pHead2==nullptr)
                return pHead1;
         
         ListNode* pMergeHead = nullptr;
         
         if(pHead1->val > pHead2->val)
         {
             pMergeHead =  pHead2;
             pMergeHead->next = Merge(pHead1,pHead2->next);
         }
         else
         {
             pMergeHead =  pHead1;
             pMergeHead->next = Merge(pHead2,pHead1->next);
         }
     return pMergeHead;
       
    }
};

思路二:非递归实现

非递归实现比较复杂,这里就不再赘述,有兴趣的朋友不妨尝试一下。

小结

1.这道题的关键是要头脑清晰,抓住关键。把握递归结构。
2.注意代码的鲁棒性。防止程序去访问空指针,否则会崩溃。
这里如果1是空指针,合并的结果就是2。如果2是空指针,合并的结果就是1。

参考文献

《剑指offer》

牛课网刷题链接link.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值