LeetCode 21.合并两个有序链表(C++)

题目地址:力扣

解法1:递归

写递归主要就是解决三个问题:

1、当前层我要干什么?

        答:需要把两个链中较小的那个节点的next指向下一层递归的结果

2、结束的边界条件是什么?

        答:任意一个链为空

3、我需要返回什么?

        答:若未触发边界条件,将当前处理的节点返回给上层。若触发边界条件,返回不为空的那个链。

代码如下:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        // 这里是边界条件
        if (list1 == nullptr)
            return list2;
        else if (list2 == nullptr)
            return list1;
        // 这里是分情况进行递归
        else if (list1->val < list2->val)
        {
            // 干当前层需要干的事情
            list1->next = mergeTwoLists(list1->next, list2);
            return list1;
        } else {
            list2->next = mergeTwoLists(list1, list2->next);
            return list2;
        }
    }
};

解法2:迭代

迭代的方法就是先设置一个哨兵节点来防止一些边界情况。

然后进行循环,只要不满足循环退出的条件,就一直在两条链之间进行穿针引线,最后将两条链的节点穿在一条线上,返回哨兵节点的next就结束了

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode newHead = ListNode(0); // 先设置一个哨兵节点
        ListNode *pre = &newHead;

        while(true){    // 跳出循环的条件是两条链中一条为空的情况
            if (list1 == nullptr)
            {
                pre->next = list2;
                break;
            }
            else if (list2 == nullptr)
            {
                pre->next = list1;
                break;
            }
            else{    // 都不为空,那么就把pre的next指向较小的节点,pre再移动到其next,然后把较小节点所在链的指针向后移动
                if (list1->val > list2->val)
                {
                    pre->next = list2;
                    pre = pre->next;
                    list2 = list2->next;
                } else {
                    pre->next = list1;
                    pre = pre->next;
                    list1 = list1->next;
                }
            }
        }
        return newHead.next;
    }
};

Accepted

  • 208/208 cases passed (8 ms)
  • Your runtime beats 59.34 % of cpp submissions
  • Your memory usage beats 29.81 % of cpp submissions (14.4 MB)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值