leetcode_21 合并两个有序链表

1. 题意

合并两个有序链表。

2. 题解

2.1 递归

如果其中一个链表为空了,就直接返回另一个链表的头节点。

如果两个都不空,则取其中较小的链表头节点。再递归处理剩下的链表。

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if ( list1 == NULL )
            return list2;
        if ( list2 == NULL )
            return list1;
        

        if ( list1->val < list2->val) {
            list1->next = mergeTwoLists( list1->next, list2 );
            return list1;
        }
        else {
            list2->next = mergeTwoLists( list1, list2->next);
            return list2;
        }
    }
};
2.2 迭代

可以用一个头节点来减少复杂度。

同时我们只需要维护新链表的尾节点即可。

我们在循环中处理两个链表均非空的情况,当处理完成后最多只有一个

链表非空了再单独处理一下就好了。

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        
        auto dumpNode = make_shared<ListNode>(-1);

        ListNode *tail = dumpNode.get();

        while ( list1 && list2 ) {
            if ( list1->val < list2->val ) {
                tail->next = list1;
                tail = list1;
                list1 = list1->next;
            }
            else {
                tail->next = list2;
                tail = list2;
                list2 = list2->next;
            }
        }

        tail->next = list1 == NULL ? list2 : list1;
        
        
        return dumpNode->next;
    }
};

3. 参考

leetcode

相关推荐
蓝色汪洋1 小时前
xtu oj矩阵
算法
hh随便起个名7 小时前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
Dingdangcat868 小时前
城市交通多目标检测系统:YOLO11-MAN-FasterCGLU算法优化与实战应用_3
算法·目标检测·目标跟踪
tang&9 小时前
滑动窗口:双指针的优雅舞步,征服连续区间问题的利器
数据结构·算法·哈希算法·滑动窗口
拼命鼠鼠9 小时前
【算法】矩阵链乘法的动态规划算法
算法·矩阵·动态规划
LYFlied9 小时前
【每日算法】LeetCode 17. 电话号码的字母组合
前端·算法·leetcode·面试·职场和发展
式51610 小时前
线性代数(八)非齐次方程组的解的结构
线性代数·算法·机器学习
橘颂TA11 小时前
【剑斩OFFER】算法的暴力美学——翻转对
算法·排序算法·结构与算法
叠叠乐11 小时前
robot_state_publisher 参数
java·前端·算法
hweiyu0011 小时前
排序算法:冒泡排序
算法·排序算法