2021-08-01 刷题 合并两个有序链表

时间:2021-08-01
本文章向大家介绍2021-08-01 刷题 合并两个有序链表,主要包括2021-08-01 刷题 合并两个有序链表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/

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

题目示例:示例 1:

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

示例 2:

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

示例 3:

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


题目思路:

 如上,力扣平台已经给出了函数方法,可以使用递归的思想与非递归的思想进行解决

非递归思想:

1、创建虚拟头结点与指向头结点的指针

2、进行判断链表是否为空,l1 为空怎么解决,l2为空怎么解决,l1、l2都不为空怎么解决

3、l1 l2 都不为空时 需要对链表里的变量进行判断,若l1.val < l2.val  需要将p指针指向l1、l1指针指向下一个变量

代码:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        //非递归做法
        ListNode * head = new ListNode(0);//链表都有虚拟的头结点,定义虚拟的头结点
        ListNode *p = head;//定义一个listnode类型的指针,并指向头结点
        //1、首先判断两个链表是否为空,都不为空时
        while(l1 && l2 ){
            //2、判断l1 与 l2 的值 l1 l2 为两个指针,从0开始索引
                if(l2->val > l1->val)
                {
                    p->next = l1;
                    l1=l1->next;
                }
                else
                {
                    p->next = l2;
                    l2=l2->next;
                }
                //存入数值后,将值往后移动一位
                p=p->next;
        }
        //当有L1或者L2为空时,直接将另一个链表中剩下的数存入p的尾部
        if(l1 !=nullptr)
        {
            p->next=l1;
        }
        if(l2 !=nullptr){
            p->next=l2;
        }
        return head->next;
    }
};

递归代码:

   public ListNode mergeTwoLists(ListNode l1, ListNode l2){
        if(l1 == null){
            return l2;
        }
        if(l2 == null){
            return l1;
        }
        if(l1->val < l2->val){
            l1->next = mergeTwoLists(l1->next,l2);
            return l1;
        }else{
            l2->next = mergeTwoLists(l1,l2->next);
            return l2;
        }
        
    }
}

原文地址:https://www.cnblogs.com/gjianli/p/15086842.html