合并两个排序的链表

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

题目来源: 牛客网

思路:
整体思路而言, 就是双指针, 把每一个节点的值拿出来与要插入的链表比较, 也用到插入排序的一个思路, 只是将数组换成了链表
最重要的是, 我们要插入一个节点就要注意相关节点的断链和链接

具体的操作流程见代码及代码注释

代码示例:

/*
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 && pHead2 != nullptr)
	            return pHead2;
	        if (pHead1 != nullptr && pHead2 == nullptr)
	            return pHead1;
	        if (pHead1 == nullptr && pHead2 == nullptr)
	            return nullptr;
	        //双指针
	        ListNode* p1 = pHead1;
	        ListNode* p2 = pHead2;
	        ListNode* tmp1 = nullptr;
	        while (p1 != nullptr && p2 != nullptr)
	        {
	        	//把pHead2所指向的链表中的每个节点拿出来与pHead1所指向的链表比较
	        	//当p2->val >= p1->val时, 找到插入位置, 此时要插入的位置是p1的上一个节点, 因此 需要tmp保存p1的上一个节点
	            while (p1 != nullptr && (p2->val >= p1->val))
	            {
	                tmp1 = p1;
	                p1 = p1->next;
	            }
	            //这里的条件判断是为了防止 pHead2->val < pHead1->val
	            if (tmp1 != nullptr)
	            {
	                tmp1->next = p2;
	                //这里是为了防止pHead2所指向的链表中连续出现相等的值, 因此不更新tmp1的值为插入之后的节点p2的话, 就把把具有相同值的节点插在同一个节点之后, 出现数据丢失
	                tmp1 = p2;
	            }
	            //从pHead2中拿出要插入的节点时, 要保存该节点的下一个节点, 不然下次循环就找不到pHead2中的节点了
	            ListNode* tmp2 = p2->next;
	            //这里的条件判断是防止pHead1的长度大于pHead2的长度
	            if (tmp2 == nullptr)
	            {
	                p2->next = p1;
	                break;
	            }
	            //这里的条件判断是防止pHead2的长度大于pHead1的长度
	            if (p1 != nullptr)
	                p2->next = p1;
	            else
	                p2->next = tmp2;
	            p2 = tmp2;
	        }
	        //返回值为链表头
	        return (pHead1->val <= pHead2->val) ? pHead1 : pHead2;
	    }
	};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值