Leetcode第21题(合并两个有序链表)

简介: 这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。

题目描述:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:

输入:l1 = [], l2 = [] 输出:[]
示例 3:输入:l1 = [], l2 = [0] 输出:[0]

非递归方式:

创建一个虚拟头节点retNode, 一个节点指针curNode指向虚拟头节点retNode, 循环结束条件为l1 或者 l2 链表其中一个链表遍历完成, 如果当前l1节点的值小于等于当前l2节点的值, 用l1->val值创建一个节点,连接到curNode节点的后面, 然后l1向后走, 反之l2当前节点的值创建节点连接到curNode节点后面, l2 向后走, 直到其中一个链表遍历完毕, 将未遍历完成的链表后续节点连接到curNode节点的后面,连接后curNode向后移动, 然后返回虚拟节点retNode->next即可。

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* retNode = new ListNode(0),*curNode = retNode;
        while(l1 && l2){
            if(l1->val <= l2->val){
                curNode->next = new ListNode(l1->val);
                l1 = l1->next;
            }else{
                curNode->next = new ListNode(l2->val);
                l2 = l2->next;
            }
            curNode = curNode->next;
        }
        curNode->next = l1?l1:l2;
        return retNode->next;
    }
};

递归方式:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(l1 == nullptr) return l2;
        if(l2 == nullptr) return l1;
        //递归
        if(l1->val <= l2->val){
            l1->next = mergeTwoLists(l1->next,l2);
            return l1;
        }else{
            l2->next = mergeTwoLists(l2->next,l1);
            return l2;
        }
    }
};
相关文章
|
1天前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
7 0
LeetCode第二十四题(两两交换链表中的节点)
|
1天前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
6 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
23小时前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
6 0
|
1天前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
10 0
|
1天前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
7 0
|
1天前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
7 0
|
1天前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
7 0
|
2月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
2月前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
2月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素