剑指offer-合并两个排序的链表

题目描述

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

算法思想

合并两个有序的链表非常的简单。
首先申请一个输出链表
① 判断两个链表是否都为空,如果都为空返回空。
② 判断两个链表谁小,将小的链表的节点放在输出链表上,然后再进行比较
③ 当其中一个链表为空了,直接把剩下的不为空的链表接在输出链表后面即可

代码实现
#include <stdc++.h>

using namespace std;


struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* output = new ListNode(-1);
        ListNode* outputHead = output;

        if(pHead1 == NULL && pHead2 == NULL) return NULL;
        while(pHead1 != NULL && pHead2 != NULL)
        {
            if(pHead1->val <= pHead2->val)
            {
                output->next = pHead1;
                pHead1 = pHead1->next;
                output = output->next;
            }
            else
            {
                output->next = pHead2;
                pHead2 = pHead2->next;
                output = output->next;
            }
        }
        if(pHead1 == NULL && pHead2 != NULL)
            output->next = pHead2;
        if(pHead1 != NULL && pHead2 == NULL)
            output->next = pHead1;
        return outputHead->next;

    }
};

int main()
{
    Solution S;
    //pHead1={1,3}
    //pHead2={2,4}
    ListNode* pHead1 = new ListNode(1);
    pHead1->next = new ListNode(3);
    ListNode* pHead2 = new ListNode(2);
    pHead2->next = new ListNode(4);
    ListNode* output = S.Merge(pHead1, pHead2);
    //输出合并之后的列表
    while(output != NULL)
    {
        cout << output->val << endl;
        output = output->next;
    }
    cout << "Hello world!" << endl;
    return 0;
}

运行截图

codeblock运行上面代码截图:
在这里插入图片描述
剑指offer截图:
在这里插入图片描述

总结

其实这个题非常的简单,但是有很多细节需要注意。
第一个:申请output链表的时候一定给他一个初值,上面代码我给的初值是-1,如果不给初值,代码是通过不了的,个人认为应该是如果不给初值,代码并没有分配固定的指针,所以代码会出现错误。
第二个:别忘了再申请一个outputHead指针指向输出链表,这样在以后的操作都可以用output->next,最后返回的时候可以返回outputHead->next,这种做法可以避免第一个数据需要单独处理的问题。
第三个:上面代码中每一个需要合并的链表只有两个节点 ,第一个链表是1、3,第二个链表是2、4,如果增加节点,千万别忘传入合并函数的两个链表指针一定要指向链表的头结点。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值