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

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

前言: 

        🎈欢迎大家来到Dream_Chaser~的博客🎈

        本文收录于 C--数据结构刷题的专栏中 -->http://t.csdn.cn/n6UEP

        首先欢迎大家的来访,其次如有错误,非常欢迎大家的指正!我会及时更正错误!

目录

一.合并两个有序链表

1.1核心逻辑        

1.2两元素相同时选谁尾插?


一.合并两个有序链表

来源:21. 合并两个有序链表 - 力扣(LeetCode)

题目:

【链表OJ 5】合并两个有序链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

解析:

        函数的参数是两个指向 ListNode 结构体的指针, ListNode 是一个常见的链表节点结构。ListNode 结构一般包含两个成员:一个是存储节点值的变量(比如 val ),另一个是指向下一个节点的指针(比如 next )。

        

        目的是把两个已排序的链表( list1 和 list2 )合并为一个新的已排序的链表,并返回这个新链表的头节点

1.1核心逻辑        

以下是该函数的核心逻辑:

  1. 首先,如果 list1list2 是空链表(即NULL),函数会直接返回另一个链表。这是因为合并一个空链表和一个非空链表的结果就是那个非空链表。

  2. 接着,它进入了一个while循环。在这个循环中,只要list1list2都不为空,就会比较它们当前节点的值。如果 list1 的当前节点值小于 list2 的当前节点值,就把list1 的当前节点加入到新链表中(先让tail -> next= list1  ,然后tail=tail->next 指向list1),,然后 list1 把向后移动一位,。否则,就把list2的当前节点加入到新链表中(先让tail -> next= list2  ,然后tail=tail->next 指向list2),然后把list2向后移动一位。这样可以保证新链表的节点是按照升序排列的。

  3. head和 tail 是两个辅助指针,用来构建新链表。head指向新链表的头节点,tail指向新链表的尾节点。每次添加一个新节点时,都会更新tail指向新加入的节点。

  4. list1list2 中有一个被完全遍历(即变为NULL)后,while循环就会结束。此时,如果list1list2中还有剩余的节点,就把这些节点全部加入到新链表的尾部。这是可以做的,因为这些剩余的节点已经是按照升序排列的,而且它们的所有值都大于新链表中已有节点的值。

  5. 最后,函数返回新链表的头节点 head

1.2两元素相同时选谁尾插?

我解释一下为什么当list1指向的元素与list2指向的元素大小相等时,用list2尾插:

在两个链表元素相等的情况下,默认选择lsit1作为较大的元素。

list1list2指向的元素都是1时,来到了if else 语句,如果条件为真,进入循环,则证明选择list2作为较大元素,反之选择list1为较大元素

【链表OJ 5】合并两个有序链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

 结果程序来到了else处,此刻list2小于list1,选择list2尾插,说明list1list2【链表OJ 5】合并两个有序链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

 动图解析:(点进去放大看更清晰)

【链表OJ 5】合并两个有序链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
   if(list1==NULL)
      return list2;//若第一个链表为 NULL,直接返回第二个链表
   if(list2 ==NULL)
      return list1;//若第二个链表为 NULL,直接返回第一个链表

   struct ListNode* head=NULL,*tail=NULL;
   while(list1 && list2)
   {
     if(list1->val < list2->val)//比较链表元素谁大,核心是小的先为尾插
     {
         if(tail==NULL)
          {
             head= tail= list1;
          }
         else
          {
            tail->next=list1;//让新链表的结点与list1指向的元素想链接
            tail=tail->next;
          }
        list1=list1->next;//list1往原始链表后面遍历
     }
   else
   {
      if(tail == NULL)
       {
           head= tail =list2;
       }
      else
       {
          tail->next=list2;//让新链表的结点与list2指向的元素想链接
          tail=tail->next;
      }
         list2=list2->next;//list2往原始链表后面遍历
      }
   }
//若其中一个链表已经遍历到NULL,直接把另一个链表的所有元素原封不动拷贝到新链表
     if(list1)
     {
        tail->next=list1;
     }
     
     if(list2)
     {
      tail->next=list2;
     }
    return head;
 }
 

代码执行: 

【链表OJ 5】合并两个有序链表,C--数据结构刷题,链表,数据结构,c语言,开发语言,笔记,vscode

         本文到此结束,如有错误,随时欢迎大家指正!文章来源地址https://www.toymoban.com/news/detail-637531.html

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

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

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

相关文章

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

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

    2024年02月07日
    浏览(27)
  • 【Leetcode刷题】链表的中间结点和合并两个有序链表

    生命如同寓言,其价值不在与长短,而在与内容。                                ——塞涅卡 目录 一.链表的中间结点 1.快慢指针 二.合并两个有序链表  1.尾插法 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点

    2023年04月17日
    浏览(27)
  • 反转链表、链表的中间结点、合并两个有序链表【LeetCode刷题日志】

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 这里解释一下三个指针的作用: n1:记录上一个节点,如果是第一个就指向空 n2:记录此节点的位置 n3:记录下一个节点的位置,让翻转后能找到下一个节点

    2024年02月03日
    浏览(34)
  • 【刷题笔记8.15】【链表相关】LeetCode:合并两个有序链表、反转链表

    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 = [], l2 = [] 输出:[] 示例 3: 输入:l1 = [], l2 = [0] 输出:[0] 此题没啥好说的,直接上代码,自己好好分析

    2024年02月12日
    浏览(31)
  • 【每日算法 && 数据结构(C++)】—— 03 | 合并两个有序数组(解题思路、流程图、代码片段)

    An inch of time is an inch of gold, but you can’t buy that inch of time with an inch of gold. An inch of time is an inch of gold, but you can\\\'t buy that inch of time with an inch of gold 给你两个有序数组,请将两个数组进行合并,并且合并后的数组也必须有序 这个题目要求将两个有序数组合并成一个有序数组。在数

    2024年02月11日
    浏览(33)
  • 【数据结构】链表OJ面试题(《删除定值、反转、返回中间结点、倒数第k节点、合并链表》)+解析)

    还不清楚链表的码喵们可以看看前篇关于链表的详解 既然已经懂得了链表该如何实现,那么现在就趁热打铁开始练习!这里给码喵们整理了相对不错的一些OJ题来练习  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路:遍历整个表,访问每个表的值并且删除再将nex

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

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

    2024年02月12日
    浏览(28)
  • 27、链表-合并两个有序链表

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

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

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

    2023年04月27日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包