【Leetcode刷题】链表的中间结点和合并两个有序链表

这篇具有很好参考价值的文章主要介绍了【Leetcode刷题】链表的中间结点和合并两个有序链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生命如同寓言,其价值不在与长短,而在与内容。                                ——塞涅卡

目录

一.链表的中间结点

1.快慢指针

二.合并两个有序链表 

1.尾插法


一.链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

【Leetcode刷题】链表的中间结点和合并两个有序链表


输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:
 

【Leetcode刷题】链表的中间结点和合并两个有序链表


输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

做题链接:链表的中间结点

1.快慢指针

我们知道找到链表的尾结点是很容易的,我们只需要遍历整个链表,直到有个结点的next为空,即找到了尾结点。那我们如何找到中间结点呢?这里我们们又要用到双指针了,这里使用的是快慢双指针,快指针一次走两个结点,慢指针一次走一个结点。直到快指针走到尾,即慢指针走到中间结点,我们直接返回慢指针,就是中间结点的位置。
画图理解:
奇数个结点时:

【Leetcode刷题】链表的中间结点和合并两个有序链表

偶数个结点时: 
【Leetcode刷题】链表的中间结点和合并两个有序链表

通过画图,我们就可以很好的理解了,废话不多说,我们直接上代码:

struct ListNode* middleNode(struct ListNode* head){
         struct ListNode*fast=head;
         struct ListNode*slow=head;
         while(fast&&fast->next)
         {
             fast=fast->next->next;
             slow=slow->next;
         }
         return slow;
}

二.合并两个有序链表 

1.尾插法

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

【Leetcode刷题】链表的中间结点和合并两个有序链表

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


示例 2:
输入:l1 = [], l2 = []
输出:[]


示例 3:
输入:l1 = [], l2 = [0]
输出:[0]

做题链接:合并两个有序链表
这题我们可以使用尾插法,我们创建一个哨兵头结点,再一个创建一个头指针,一个尾指针,头指针始终指向最开始的头结点,为了最后的返回。我们依次取下两个链表数值小的那个结点尾接到尾,尾接一个,尾指针往后面走一位。依次类推,把所有的结点尾接起来。
我们还是一样,画图来更好的理解一下。
【Leetcode刷题】链表的中间结点和合并两个有序链表

直接上代码:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
            if(list1==NULL)
            return list2;
            if(list2==NULL)
            return list1;
           struct ListNode*head=NULL,*tail=NULL;
           head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));//创建头结点
            while(list1&&list2)
            {
               if(list1->val>list2->val)
               {
                    tail->next=list2;
                    list2=list2->next;
                }
                else
                {
                    tail->next=list1;
                    list1=list1->next;
                }
                tail=tail->next;
            }
             if(list1)//退出循环,如果list1不为空,即list2尾空。
             tail->next=list1;//只需要把剩下的list1尾接到最后即可
             if(list2)
             tail->next=list2;
             struct ListNode*first=head->next;//保存哨兵位的下一个结点
             free(head);//释放头结点
             head=NULL;
             return first;
}

感谢!!! 文章来源地址https://www.toymoban.com/news/detail-416039.html

到了这里,关于【Leetcode刷题】链表的中间结点和合并两个有序链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【力扣刷题】回文链表、环形链表、合并两个有序链表

    🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 首先是要对该链表进行非空校验,若

    2024年02月07日
    浏览(31)
  • 链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::分析力扣中有关链表的部分题目. 题目来源于:牛客网-题目链接 输入一个链表,输出该链表中倒数第k个结点。 示例: 输入:1,{1,2,3,4,5} 返回值:{5} 创建两个指针: ①

    2024年02月10日
    浏览(33)
  • 第21关:基于链表的两个递增有序序列的合并

    任务描述 本关任务:给定两个递增的整数序列A和B,利用链表表示序列A和B,将A和B合并为一个递增的有序序列C,序列C不允许有重复的数据。要求空间复杂度为O(1)。 编程要求 输入 多组数据,每组数据有三行,第一行为序列A和B的长度n和m,第二行为序列A的n个元素,第三行为

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

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

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

    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 : 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 创建一个新的链表头节点(dummyNode)和一个指针current,用于表示当前节点。 在一个while循环中,比较两个链表的节

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

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

    2024年02月13日
    浏览(33)
  • 【链表OJ】链表中倒数第k个结点 合并两个链表(含哨兵位) 分割链表 链表的回文结构

    前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣和牛客上链表OJ题目 目录  一、链表中倒数第k个结点 题目描述: 解题思路: 二.合并两个链表(含哨兵位)  题目描述: 解题思路:                                     

    2024年02月12日
    浏览(30)
  • Leetcode算法递归类—合并两个有序链表

    目录 21. 合并两个有序链表 题解: 代码: 将两个升序链表合并为一个新的  升序  链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例 1: 示例 2: 示例 3: 提示: 两个链表的节点数目范围是  [0, 50] -100 = Node.val = 100 l1  和  l2  均按  非递减顺序  

    2024年02月13日
    浏览(29)
  • 合并两个有序链表,将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

    题记: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入 :l1 = [1,2,4], l2 = [1,3,4] 输出 :[1,1,2,3,4,4] 示例 2: 输入 :l1 = [], l2 = [] 输出 :[] 示例 3: 输入 :l1 = [], l2 = [0] 输出 :[0] 提示: 两个链表的节点数

    2024年02月07日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包