合并两个排序的链表

题目描述

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

思路:用pNode1遍历链表1,用pNode2遍历链表2,循环只有两个链表都遍历完才结束,

即终止条件:pNode1 == nullptr || pNode2 == nullptr

所以有三种情况:

1、pNode1 == nullptr || pNode2 != nullptr

2、pNode1 != nullptr || pNode2 == nullptr

3、pNode1 != nullptr || pNode2 != nullptr

1、2情况是某条链表遍历完成,只需将未遍历完的链表的节点一次加入返回的链表中

3中两链表均为遍历完,需要将两链表的头节点进行比较,将较小的加入结果链表

 

尝试过将13、23合并:

pNode1 == nullptr || pNode1->val > pNode2->val

如果左边不成立,即pNode1 != nullptr,则pNode2可能为nullptr,这时pNode2->val会出错

 

方法二:递归,参考《剑指offer》

 

/*
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 nullptr;
        
        ListNode* pNode1 = pHead1;
        ListNode* pNode2 = pHead2;
        
        //头节点
        ListNode* pRet = new ListNode(0);
        ListNode* pNode3 = pRet;
        
        while(pNode1 != nullptr || pNode2 != nullptr){
            if(pNode1 == nullptr){
                pNode3->next = pNode2;
                pNode3 = pNode3->next;
                pNode2 = pNode2->next;
            }
            else if(pNode2 == nullptr){
                pNode3->next = pNode1;
                pNode3 = pNode3->next;
                pNode1 = pNode1->next;
            }
            else{
                if(pNode1->val > pNode2->val){
                    pNode3->next = pNode2;
                    pNode3 = pNode3->next;
                    pNode2 = pNode2->next;
                }
                else{
                    pNode3->next = pNode1;
                    pNode3 = pNode3->next;
                    pNode1 = pNode1->next;
                }
            }
        }
        return pRet->next;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值