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

这篇具有很好参考价值的文章主要介绍了合并两个有序链表,将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

示例 1:
合并链表为一个升序链表,PHP,链表,数据结构,leetcode,算法,php

输入: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/leetbook/read/top-interview-questions-easy/xnnbp2/
来源:力扣(LeetCode)

解题方法:
一:
因为链表是升序的,我们只需要遍历每个链表的头,比较一下哪个小就把哪个链表的头拿出来放到新的链表中,一直这样循环,直到有一个链表为空,然后我们再把另一个不为空的链表挂到新的链表中。

我们就以3→4→7→9和2→5→6两个链表来画个图看一下是怎么合并的。
合并链表为一个升序链表,PHP,链表,数据结构,leetcode,算法,php
合并链表为一个升序链表,PHP,链表,数据结构,leetcode,算法,php
合并链表为一个升序链表,PHP,链表,数据结构,leetcode,算法,php
看明白了上面的图,代码就很容易写了,我们来看一下非递归的代码

    public ListNode mergeTwoLists(ListNode linked1, ListNode linked2) {
        //下面4行是空判断
        if (linked1 == null)
            return linked2;
        if (linked2 == null)
            return linked1;
        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        while (linked1 != null && linked2 != null) {
            //比较一下,哪个小就把哪个放到新的链表中
            if (linked1.val <= linked2.val) {
                curr.next = linked1;
                linked1 = linked1.next;
            } else {
                curr.next = linked2;
                linked2 = linked2.next;
            }
            curr = curr.next;
        }
        //然后把那个不为空的链表挂到新的链表中
        curr.next = linked1 == null ? linked2 : linked1;
        return dummy.next;
    }

转换为PHP代码为:

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val = 0, $next = null) {
 *         $this->val = $val;
 *         $this->next = $next;
 *     }
 * }
 */
class Solution {

    /**
     * @param ListNode $list1
     * @param ListNode $list2
     * @return ListNode
     */
    function mergeTwoLists($list1, $list2) {
        //进行空判断
        if($list1 == null){
            return $list2;
        }
        if($list2 == null){
            return $list1;
        }

        $dummy = new ListNode(0);
        $curr = $dummy;

        while($list1 != null && $list2 != null){
            //比较,哪个小就把哪个放到新的链表中
            if($list1->val <= $list2->val){
                $curr->next = $list1;
                $list1 = $list1->next;
            }else{
                $curr->next = $list2;
                $list2 = $list2->next;
            }
            $curr = $curr->next;
        }
        //此时至少有一个链表为空了,然后把不为空的链表挂到新的链表中
        $curr->next = $list1 == null ? $list2 : $list1;
        return $dummy->next;
    }
}

二:递归方法
我们还可以把它改为递归的形式,看下递归的代码

    public ListNode mergeTwoLists(ListNode linked1, ListNode linked2) {
        if (linked1 == null)
            return linked2;
        if (linked2 == null)
            return linked1;
        if (linked1.val < linked2.val) {
            linked1.next = mergeTwoLists(linked1.next, linked2);
            return linked1;
        } else {
            linked2.next = mergeTwoLists(linked1, linked2.next);
            return linked2;
        }
    }

转换为PHP代码为:

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val = 0, $next = null) {
 *         $this->val = $val;
 *         $this->next = $next;
 *     }
 * }
 */
class Solution {

    /**
     * @param ListNode $list1
     * @param ListNode $list2
     * @return ListNode
     */
    function mergeTwoLists($list1, $list2) {
        //进行空判断
        if($list1 == null){
            return $list2;
        }
        if($list2 == null){
            return $list1;
        }

        if($list1->val <= $list2->val){
            //把list1的头结点给摘除
            $list1->next = $this->mergeTwoLists($list1->next,$list2);
            return $list1;
        }else{
            //把list2的头结点给摘除
            $list2->next = $this->mergeTwoLists($list1,$list2->next);
            return $list2;     
        }
        
    }
}

递归代码我们还可以再改一下

    public ListNode mergeTwoLists(ListNode linked1, ListNode linked2) {
        //只要有一个为空,就返回另一个
        if (linked1 == null || linked2 == null)
            return linked2 == null ? linked1 : linked2;
        //把小的赋值给first
        ListNode first = (linked2.val < linked1.val) ? linked2 : linked1;
        first.next = mergeTwoLists(first.next, first == linked1 ? linked2 : linked1);
        return first;
    }

转换为PHP代码为:

    function mergeTwoLists($list1,$list2){
        //只要有一个为空,就返回另一个
        if($list1 == null || $list2 == null){
            return $list2 == null ? $list1 : $list2;
        }
        //把小的赋值给first
        $first = ($list2->val < $list1->val) ? $list2 : $list1;
        $first->next = $this->mergeTwoLists($first->next, $first == $list1 ? $list2 : $list1);
        return $first;
    }

方法来源:
作者:数据结构和算法
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnnbp2/?discussion=1mcRST
来源:力扣(LeetCode)文章来源地址https://www.toymoban.com/news/detail-725034.html

到了这里,关于合并两个有序链表,将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 27、链表-合并两个有序链表

    27、链表-合并两个有序链表

    这道题不需要集合放入两个链表再进行重排序,只需要两个指针,按大小进行遍历,代码如下:  

    2024年04月14日
    浏览(8)
  • 21. 合并两个有序链表

    21. 合并两个有序链表

     

    2024年02月12日
    浏览(12)
  • 21.合并两个有序链表

    21.合并两个有序链表

    一、思路 二、源码 创建一个新链表 两个链表比较,小于等于取下来尾插 循环结束条件为任意一个链表为空 最后将之剩下的链表直接尾插

    2024年01月23日
    浏览(9)
  • 合并两个有序链表

    合并两个有序链表

    题目链接 :力扣21,合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 首先我们能够想到的就是 遍历一遍数组,判断两个结点的大小,将数值小的结点放在前面,数值大的不断尾插在后面 。是不是听

    2023年04月27日
    浏览(13)
  • 【链表OJ 5】合并两个有序链表

    【链表OJ 5】合并两个有序链表

    前言:          🎈欢迎大家来到Dream_Chaser~的博客🎈         本文收录于 C--数据结构刷题的专栏中 --http://t.csdn.cn/n6UEP         首先欢迎大家的来访,其次如有错误,非常欢迎大家的指正!我会及时更正错误! 目录 一.合并两个有序链表 1.1核心逻辑         1.2两

    2024年02月13日
    浏览(9)
  • 力扣21. 合并两个有序链表

    力扣21. 合并两个有序链表

    题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  链接:21. 合并两个有序链表 - 力扣(LeetCode) 题解 设置两个指针head和tail,head用来指向新链表的头结点,tail用来进行新链表的尾插。比较两个链表,取较小的结

    2024年02月16日
    浏览(20)
  • 合并两个有序链表——力扣21

    合并两个有序链表——力扣21

    题目描述 法一 递归

    2024年02月15日
    浏览(9)
  • LeetCode 21.合并两个有序链表

    LeetCode 21.合并两个有序链表

    题目链接 👉 LeetCode 21.合并两个有序链表👈 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 取小的进行尾插 👇 图解 👇 取小的进行尾插 👇 图解 👇 🥰 希望烙铁们能够理解欧! 总结🥰 以上就是本题讲解的全部内

    2024年02月13日
    浏览(11)
  • Leetcode 21. 合并两个有序链表

    Leetcode 21. 合并两个有序链表

    题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/description/ 两个链表都是升序链表,新建一个链表,引入伪头节点作为辅助节点,将各节点添加到伪节点之后,再用一个cur节点指向新链表的末尾 遍历两个链表,对比每个节点值,将更小的链表节点加入到新链表中 如果其中一

    2024年02月13日
    浏览(7)
  • Leecode之合并两个有序链表

    Leecode之合并两个有序链表

    目录 一.题目及剖析 二.思路引入 三.代码引入 四.扩展 https://leetcode.cn/problems/merge-two-sorted-lists/description/ 将两个升序链表合并为一个新的  升序  链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例 1: 示例 2: 示例 3: 提示: 两个链表的节点数目范围

    2024年02月20日
    浏览(5)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包