IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 剑指offer系列——剑指 Offer 25. 合并两个排序的链表 -> 正文阅读

[数据结构与算法]剑指offer系列——剑指 Offer 25. 合并两个排序的链表

??前面的话??

大家好!本篇文章将介绍关于数据结构之链表的OJ题,来自力扣:21. 合并两个有序链表剑指 Offer 25. 合并两个排序的链表 题解,展示代码语言暂时为:Java语言与C语言。(后续会更新C++代码)

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏??留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2021年11月30日🌴
??坚持和努力一定能换来诗与远方!
💭刷题推荐书籍:📚《剑指offer专项版》,📚《剑指offer第2版》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!



0


??剑指 Offer 25. 合并两个排序的链表??

🔐题目详情

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

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

提示:
两个链表的节点数目范围是 [ 0 , 50 ] [0, 50] [0,50]
? 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 ?100<=Node.val<=100
l 1 l1 l1 l 2 l2 l2 均按 非递减顺序 排列

来源:力扣(LeetCode)链接:剑指 Offer 25. 合并两个排序的链表

💡解题思路

方法1:构造一个头结点,遍历两链表,按数据域值大小按顺序尾插至头结点后。
步骤:

  1. 构造头结点 h e a d head head
  2. 两链表同时遍历,将较小值的链表先尾插至 h e a d head head结点后(如果相等,随便一个结点尾插即可),结果返回head结点的后一个结点即可。
  3. 如果遍历过程中,有链表遍历完或者指针(引用)指向 n u l l null null,结束遍历,直接将未遍历完的链表的剩余所有结点尾插至 h e a d head head链表后面。

1-2
1-3
1-4

方法2:递归。
步骤:
假设有两个排好序的链表(升序)分别为 l i s t 1 , l i s t 2 list1,list2 list1,list2,遍历时的引用(指针)分别为 c u r 1 , c u r 2 cur1,cur2 cur1,cur2

  1. 新建一个链表结点引用(指针) c u r cur cur,递归函数为 m e r g e T w o L i s t s ( s t r u c t L i s t N o d e ? l i s t 1 , s t r u c t L i s t N o d e ? l i s t 2 ) mergeTwoLists(struct ListNode* list1, struct ListNode* list2) mergeTwoLists(structListNode?list1,structListNode?list2),返回值为链表引用(指针)。
  2. 递归过程中,每次使 c u r cur cur指向较小结点 m i n ( c u r 1 , c u r 2 ) min(cur1,cur2) min(cur1cur2),函数返回 c u r cur cur
  3. 如果cur1结点数据域的值较小,则 c u r cur cur n e x t next next域指向 m e r g e T w o L i s t s ( c u r 1. n e x t , c u r 2 ) mergeTwoLists(cur1.next,cur2) mergeTwoLists(cur1.nextcur2),反之指向 m e r g e T w o L i s t s ( c u r 1 , c u r 2. n e x t ) mergeTwoLists(cur1,cur2.next) mergeTwoLists(cur1cur2.next)
  4. 递归条件为传入的结点是否为 n u l l null null,如果为 n u l l null null返回另一个结点地址。

1-9

🔑源代码

方法1:Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //1. 新建一个结点用作头结点,然后同时遍历两个链表,将值小的结点按顺序插入在这个头结点后
        ListNode newNode = new ListNode();
        ListNode tmp = newNode;
        //2.同时遍历两个链表,将数据域值小的结点依次插入值newNode结点后面,形成一个新链表,如果遍历出现null,则结束遍历
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                tmp.next = l1;
                l1 = l1.next;
                tmp = tmp.next;
            }
            else {
                tmp.next = l2;
                l2 = l2.next;
                tmp = tmp.next;
            }
        }
        //3.对两链表经过遍历相同次数后,将更长链表后面的结点接入到新链表后
        if (l1 != null) {
            tmp.next = l1;
        }
        if (l2 != null) {
            tmp.next = l2;
        }
        //4.我们新建结点newNode后一个结点开始的链表为合并后的链表
        return newNode.next;
    }
}

方法2:C

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    if (!l1)
        return l2;
    if (!l2)
        return l1;//一个链表为空则返回另一个链表

    struct ListNode* cur = NULL;

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

🌱总结

抓住链表是已经排序好这一点,遍历比较两链表的值,将链表进行重排。


觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:57:48  更:2021-12-01 17:58:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:41:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码