玩命加载中 . . .

合并两个有序链表


描述

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

示例 1:

img

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

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

输入:l1 = [], l2 = [0]
输出:[0]

提示:

两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

下面是合并两个有序链表的实现思路及步骤:

  1. 定义一个哨兵节点,用于返回合并后的链表。
  2. 定义一个指针,指向哨兵节点。
  3. 循环比较两个链表的节点,将较小的节点加入到新链表中,直到其中一个链表为空。
  4. 将剩余的节点加入到新链表中。
  5. 返回哨兵节点的下一个节点,即合并后的链表。

这个方法的时间复杂度是 O(n),其中 n 是两个链表的总长度。空间复杂度是 O(1),因为它只使用了常量级别的额外空间。

C++代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        // 如果其中一个链表为空,则直接返回另一个链表
        if (!l1) {
            return l2;
        }
        if (!l2) {
            return l1;
        }

        // 定义一个哨兵节点,用于返回合并后的链表
        ListNode* dummy = new ListNode(0);
        // 定义一个指针,指向哨兵节点
        ListNode* cur = dummy;

        // 循环比较两个链表的节点,将较小的节点加入到新链表中
        while (l1 && l2) {
            if (l1->val <= l2->val) {
                cur->next = l1;
                l1 = l1->next;
            } else {
                cur->next = l2;
                l2 = l2->next;
            }
            cur = cur->next;
        }

        // 将剩余的节点加入到新链表中
        if (l1) {
            cur->next = l1;
        }
        if (l2) {
            cur->next = l2;
        }

        // 返回哨兵节点的下一个节点,即合并后的链表
        return dummy->next;
    }
};

文章作者: Jack Tim
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Tim !
评论
  目录