两种方法合并两个有序链表(递归和双指针)

文章目录

关于合并和之前那道逆序,我想了一下看看能否合并也可以不用创建一个头节点,然而似乎事情没这么简单,还是得创建一个头节点,除非用递归的方法。。

递归法

重点注意:
1.触底条件的判断,当只要有一个为NULL则说明该组链表已经比较完,直接连上另一链表即可。
2.利用递归对单个符合要求的结点进行分散,注意return的位置。

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
                ListNode* head;
        //触底条件:
         if (l1 == NULL)
            return head = l2;
         if (l2 == NULL)
            return head = l1;
        //利用递归对其进行处理
        if (l1 && l2)
    //比较此时l1和l2的值,把小的作为当前结点取下。利用head->next不断把每个分散的结点连起来。
            if (l1->val < l2->val)
            {
                head = l1;
                head->next = mergeTwoLists(l1->next, l2);
            }
            else 
            {
                head = l2;
                head->next = mergeTwoLists(l1, l2->next);
            }
       
        return head;
    }
};

双指针法


class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        //建立一个头节点用于保持操作的统一
        ListNode* head = new ListNode;
        head->next = NULL;
        //建立cur指针用于连接符合条件的结点
        ListNode* cur = head;
        //若两者均不为空,则不断的比较和连接
        while(l1!=NULL&&l2!=NULL){
            if(l1->val<l2->val){
                cur->next = l1;
                l1=l1->next;
                cur=cur->next;
            }
            else{
              cur->next = l2;
              l2=l2->next; 
              cur=cur->next;
            }
        }
        //连接完后,若有不为空的结点,则将其连上。
        if(l1==NULL){
            cur->next = l2;
        }
        if(l2==NULL){
            cur->next = l1;
        }
        //返回头节点的next
        return head->next;
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值