两个单调增列表的合并

这篇博客探讨如何合并两个单调递增的链表,以保持合并后的链表依然单调不减。作者提出了几种不同的实现思路,包括创建新头节点进行比较、选择一个链表作为模板进行插入,以及个人的改进方法。尽管在某些环境下运行正确,但遇到了在特定平台上的数组越界问题。
摘要由CSDN通过智能技术生成

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

思路:

常见的思路:

  1. 另创一个head,然后从头到尾一直比较,取小的接到head后面,循环比较。

  1. 选取一个链表当做模板,遍历另外一个,一个个比较,然后插进去,相当于选择插入排序。

自己的思路,和其他差不多,只是稍微改造了一下。(注:VS2019通过,且结论正确,但是牛客一直说数组越界。)就用图表示了:

代码:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* p1 = pHead1;
        ListNode* p2 = pHead2;
        ListNode* p1_fllow = pHead1, * p2_fllow = pHead2;
        
        bool b2Big = true;
        if(p2->val >= p1->val)
            b2Big = true;
        else
            b2Big = false;
        bool resutlBegin = b2Big;
        while(p1 != NULL && p2 != NULL)
        {
            //上一步是p1>p2 这一步还是p1 > p2
            if(p1->val > p2->val && !b2Big)
            {
                p2_fllow = p2;
                p2 = p2->next;
            }//上一步是p1 < p2 ,这一步还是p1<p2
            else if (p1->val <= p2->val && b2Big)
            {
                p1_fllow = p1;
                p1 = p1->next;
            }//上一步p1 < p2 ,这一步p1 > p2
            else if(p1->val > p2->val && b2Big)
            {
                p1_fllow->next = p2;
                p2_fllow = p2;
                p2 = p2->next;
                b2Big = false;
            }//上一步p1 > p2 ,这一步p1<p2;
            else if(p1->val <= p2->val && !b2Big)
            {
                p2_fllow->next = p1;
                p1_fllow = p1;
                p1 = p1->next;
                b2Big = true;
            }
        }
        if (b2Big)//p2 > p1
		    p1_fllow->next = p2;
	    else
		    p2_fllow->next = p1;
        
        delete p1,p2,p1_fllow,p2_fllow;
        p1 = NULL;
        p2 = NULL;
        p2_fllow = NULL;
        p1_fllow = NULL;
        
        if(resutlBegin)//p2 > p1
            return pHead1;
        else
            return pHead2;
        
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值