剑指offer——合并两个排序的链表C++

在这里插入图片描述
链表=指针=保证鲁棒性=检查空指针
这里用了两种方法:分别是递归和循环
递归:因为两条链表分别都是有序的,所以当一条链表的头结点为空指针时,返回另一条链表头结点即可,两条都空也没事,也就是返回一个空指针。接下来两个指针都不是空指针,定义一个指针,将当前两条链表的头结点值较小的那个赋值给这个指针。这个指针的next递归调用该函数,参数值那里改一下就行,将头结点赋给cur的往后移一位。最后返回cur即可。
循环:开头的检查是一样的,一条链表的头结点为空指针时,返回另一条链表头结点。定义一个mergeNode为空结点,它作为最后形成的单链表的头结点。再定义一个cur用来指向两条链表中比较小的那一个。这样只需要在一开始将cur和mergeNode指向同一个结点即可,只要不断改cur,mergeNode最后指向的就是一条有序的链表。while循环的条件是两条链表的当前头结点均不为空,因为只要有一个为空就很方便了,将cur的next指向另一条即可。判断p1和p2谁更大,再判断是不是第一次赋值,用mergeNode是否为空来判断,如果是第一次,将小的那个结点赋值给mergeNode和cur。如果不是第一次,就将小的那个赋值给cur->next,cur=cur->next。小的那个结点指向它自己的next。循环结束后,判断哪条链表先为空了,将cur->next指向非空的头结点。最后返回mergeNode

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    /*static bool cmp(ListNode* a, ListNode* b){
        return a->val < b->val;
    }*/
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        //涉及到指针的题一定要考虑空间鲁棒性
        //:法一:递归
        /*if(pHead1 == NULL){
            return pHead2;
        }
        else if(pHead2 == NULL){
            return pHead1;
        }
        ListNode *cur;//分别指向两条链表
        if(pHead1->val <= pHead2->val){
            cur = pHead1;
            cur->next = Merge(pHead1->next,pHead2);
        }
        else{
            cur = pHead2;
            cur->next = Merge(pHead1,pHead2->next);
        }
        return cur;*/
        
        //法2:循环
        if(pHead1 == NULL){
            return pHead2;
        }
        else if(pHead2 == NULL){
            return pHead1;
        }
        ListNode* mergeNode = NULL;//一个用来记录最后结果
        ListNode* cur = NULL;//一个用来寻找下一个较小的结点,因为改了cur,mergeNode也会改
        while(pHead1 != NULL && pHead2 != NULL){
            if(pHead1->val < pHead2->val){
                if(mergeNode == NULL){
                    mergeNode = cur = pHead1;
                }
                else{
                    cur->next = pHead1;
                    cur = cur->next;
                }
                pHead1 = pHead1->next;//这里改了也没事,只是改了指针指向别的地方,并没有改next的值
            }
            else{
                if(mergeNode == NULL){
                    mergeNode = cur = pHead2;
                }
                else{
                    cur->next = pHead2;
                    cur = cur->next;
                }
                pHead2 = pHead2->next;
            }
        }
        if(pHead1 == NULL){
            cur->next = pHead2;
        }
        if(pHead2 == NULL){
            cur->next = pHead1;
        }
        return mergeNode;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值