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; } };
hello my world
本文来自博客园,作者:slowlydance2me,转载请注明原文链接:https://www.cnblogs.com/slowlydance2me/p/16886667.html