21. 合并两个有序链表 ----- 递归调用、链表指针、哨兵指针与哨兵节点

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

 

示例 1:


输入: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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

递归

/**
 * 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* l1, ListNode* l2) {
        if (l1 == nullptr) {
            return l2;
        } else if (l2 == nullptr) {
            return l1;
        } else if (l1->val < l2->val) { // 如果升序链表1指针指向的值比链表2指针指向的值小的话,就让链表1的指针指向下一位,并通过递归调用实现下一轮比较,直到链表1指向空节点,或者链表2指针指向的值小于链表1,则换成链表2进行操作
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        } else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};

 

哨兵迭代:

/**
 * 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* l1, ListNode* l2) {
        ListNode* preHead = new ListNode(-1); // 哨兵节点

        ListNode* prev = preHead; // 哨兵指针
        while (l1 != nullptr && l2 != nullptr) { // 两个链表指针没有指向空
            if (l1->val < l2->val) { // 如果链表2指针指向的值更大
                prev->next = l1; // 哨兵节点指向链表1的头节点
                l1 = l1->next; // 链表1 的指针指向下一位
            } else { // 反之亦然
                prev->next = l2;
                l2 = l2->next;
            }
            prev = prev->next; // 哨兵指针指向下一位
        }

        // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        prev->next = (l1 == nullptr) ? l2 : l1;

        return preHead->next;
    }
};

 

posted @ 2022-11-13 19:14  slowlydance2me  阅读(24)  评论(0编辑  收藏  举报