当前位置:   article > 正文

【LeetCode】21. 合并两个有序链表_求有序链表合并

求有序链表合并

21. 合并两个有序链表(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法一:迭代(非递归)

思路

  • 当 list1 和 list2 都不是空链表时,判断 list1 和 list2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。

  • 首先,我们设定一个虚拟节点 dummy ,这可以在让我们比较容易地返回合并后的链表。我们维护一个 cur 指针,我们需要做的是调整它的 next 指针。然后重复以下过程,直到 list1 或者 list2 指向了 nullptr:

    • 如果 list1 当前节点的值小于等于 list2 ,我们就把 list1 当前的节点接在 cur 节点的后面同时将 list1 指针往后移一位。否则,我们对 list2 做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把 cur 向后移一位。
  • 在循环终止的时候, list1 和 list2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。

代码

/**
 * 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* list1, ListNode* list2) {
        ListNode *dummy = new ListNode(), *cur = dummy;
        if(!list1 || !list2) return list1 ? list1 : list2;
        while(list1 && list2){
            if(list1->val <= list2->val){
                cur->next = list1;
                list1 = list1->next;
            }
            else{
                cur->next = list2;
                list2 = list2->next;
            }
            cur = cur->next;
        }
        if(!list1 || !list2)  cur->next = list1 ? list1 : list2;
        return dummy->next; 
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

方法二:递归

思路

  • 递归的终止条件:当两个链表都为空时,表示我们对链表已合并完成。
  • 如何递归:我们判断 list1 和 list2 的头节点哪个更小,然后较小节点的 next 指针指向其余节点的合并结果。(调用递归)

在这里插入图片描述

代码

/**
 * 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* list1, ListNode* list2) {
        if(!list1 || !list2) return list1 ? list1 : list2;
        // 如果list1的第一个节点较小,那么最终返回以list1开头的链表
        if(list1->val <= list2->val){
            list1->next = mergeTwoLists(list1->next, list2);
        }
        // 如果list2的第一个节点较小,那么最终返回以list1开头的链表
        else{
            list2->next = mergeTwoLists(list1, list2->next);
            return list2;
        }
        return list1;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

参考资料

  1. 递归方法动画
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/262531
推荐阅读
相关标签
  

闽ICP备14008679号