每日一练(14):合并两个排序的链表

简介: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。


示例1:


输入:1->2->4, 1->3->4

输出:1->1->2->3->4->4


限制:

0 <= 链表长度 <= 1000


来源:力扣(LeetCode)


链接:https://leetcode-cn.com/probl...


方法一:迭代


我们的目的是将两个有序链表合并成一个有序链表,因此,我们的每次操作都是获取 l1 指向的结点和 l2 指向的结点中,值较小的结点。迭代和递归都是如此。


使用迭代的时候


  • 为了将第一个结点与其余结点统一处理,一般会定义一个头结点。

使用递归的时候

  • 我们往往可以利用递归函数的返回值,将处理好的链表的第一个结点,作为返回值返回到上一级。
  • 上一级函数则直接将得到的返回值,链接在当前结点的 next 即可。


迭代


  • 定义头结点
  • 若 l1 指向的结点值 < l2 指向的结点值,则将 l1 链接到头结点的 next 位置
  • 否则将 l2 链接到头结点的 next 位置
  • 循环进行,直至 l1 或 l2 为 NULL
  • 最后,将 l1 或 l2 中剩下的部分,链接到头结点后面


ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode *head = new ListNode(0);
    ListNode *ret = head;
    while (l1 != NULL && l2 != NULL) {
        if (l1->val < l2-> val) {
            head->next = l1;
            l1 = l1->next;
        } else {
            head->next = l2;
            l2 = l2->next;
        }
        head = head->next;
    }
    head->next = l1 == NULL ? l2 : l1;
    return ret->next;
}


方法二:递归


编写递归的第一步,应当是明确当前函数应当完成的功能。


函数功能


  • 返回 l1 指向的结点和 l2 指向的结点中,值较小的结点
  • 并将从下级函数获得的返回值,链接到当前结点尾部


函数结束条件


  • 当 l1 为空,或 l2 为空,函数结束
  • 返回 l1 或 l2 中剩下的部分


ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    if (!l1 || !l2) {    //链表判空
        return (!l2 ? l1 : l2);
    }
    if (l1->val < l2->val) {
        l1->next = mergeTwoLists(l1->next, l2); //递归
        return l1;
    } else {
        l2->next = mergeTwoLists(l1, l2->next);    //递归
        return l2;
    }
}


目录
相关文章
|
1月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
46 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
30 0
|
3月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
3月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
44 0
|
5月前
|
Go
Go语言每日一练链表篇(一)
Go语言每日一练链表篇(一)
|
5月前
23.合并K个升序链表
23.合并K个升序链表
|
5月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
|
5月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
5月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
5月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
50 2