LeetCode 热题100——链表专题

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

一、俩数相加

2.俩数相加(题目链接)

LeetCode 热题100——链表专题,每日一练,leetcode,链表,算法,数据结构

思路:这题题目首先要看懂,以示例1为例  即  342+465=807,而产生的新链表为7->0->8.

可以看成简单的从左向右,低位到高位的加法运算,4+6=10,逢10进1,新链表第三位为3+4+1(第二位进的1),需要注意的的点是当9->9->9和9->9->9->9相加,相当于9->9->9->0和9->9->9->9相加

代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef  struct ListNode  ListNode;
 ListNode * ListBuyNode(int x)
 {
     ListNode * node=(ListNode*)malloc(sizeof(ListNode));
     if(node==NULL)
     {
         perror("malloc fail:");
         return NULL;
     }
     node->val=x;
     node->next=NULL;
     return  node;
 }
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
   
   int ret=0;
   ListNode *head=(ListNode*)malloc(sizeof(ListNode));//带头单链表
  
   ListNode*pcur=head;
    while(l1||l2||ret)
    {
       if(l1)
       {
           ret=ret+l1->val;
       }
       if(l2)
       {
           ret=ret+l2->val;
       }
       ListNode *node=ListBuyNode(ret%10);
       pcur->next=node;
       pcur=pcur->next;

       if(l1)
       {
           l1=l1->next;
       }
      if(l2)
      {
           l2=l2->next;
      }
       ret=ret/10;


    }
    return head->next;
}

解析:这里使用的是带头单链表,不用考虑头节点初始化问题;还有一点是:当l1和l2都走完时,还要确定进位是否为0,不为0,新链表还得在加一个节点,储存进位。

测试及结果: 

LeetCode 热题100——链表专题,每日一练,leetcode,链表,算法,数据结构

LeetCode 热题100——链表专题,每日一练,leetcode,链表,算法,数据结构

二、回文链表

234.回文链表(题目链接)

LeetCode 热题100——链表专题,每日一练,leetcode,链表,算法,数据结构

思路:1)将链表内容复制到数组里面;

           2)使用双指针法判断是否为回文。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct   ListNode   ListNode;
bool isPalindrome(struct ListNode* head) {
    assert(head);
     int arr[100000]={0};
     int k=0;
     ListNode*pcur=head;
     while(pcur)
     {
           arr[k]=pcur->val;
           k++;
           pcur=pcur->next;
     }
      for(int i=0,j=k-1;i<j;i++,j--)
      {
          if(arr[i]!=arr[j])
          {
              return false;
          }
      }
      return true;
}

三、相交链表

160.相交链表(题目链接)

LeetCode 热题100——链表专题,每日一练,leetcode,链表,算法,数据结构

思路:这道题的思路比较巧妙,相交链表最关键是节点重合,所以判断条件是节点相等,不是节点的val相等 。

若链表其中一个为NULL,则必定不相交,返回NULL.

分类讨论:

1)链表不相交(假设pheadA的长度为m,headB的长度为n)

1>若m==n,俩链表同时遍历完,相等为NULL

2>若m!=n,headA往后遍历,若遍历结束,则返回到headB的头节点,headB往后遍历,若遍历结束,则返回到headA的头节点,当遍历m+n次,他们都相等为NULL

2)链表相交(假设pheadA的长度为m,headB的长度为n,相交点到headA的头节点距离为a,相交点到headB的头节点距离为b,相交点到末尾的长度为c)

注:a+c=m,b+c=n

1>若m==n,在遍历完第一遍之前,必定有headA==headB!=NULL

2>若m!=n,headA往后遍历,若遍历结束,则返回到headB的头节点,headB往后遍历,若遍历结束,则返回到headA的头节点,当headA遍历a+c+b次,headB遍历b+c+a,同时到达相交点,headA==headB!=NULL

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct  ListNode  ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    ListNode *p1=headA;
    ListNode*p2=headB;
    if(p1==NULL)
    {
        return NULL;
    }
    if(p2==NULL)
    {
        return NULL;
    }
   while(p1!=p2)
  {
    p1 = p1 == NULL ? headB : p1->next;
    p2 = p2 == NULL ? headA : p2->next;
  }
   //p1与p2不相交,则为NULL;p1与p2相交,则为不为NULL
   if(p1==NULL)
   {
       return NULL;
   }
    return p1;
}

四、删除链表倒数第N个节点

19.删除链表的倒数第N个节点
LeetCode 热题100——链表专题,每日一练,leetcode,链表,算法,数据结构

解法一:快慢指针(这里使用无头链表,需要对删除头节点额外考虑) 

typedef struct ListNode ListNode;
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
   assert(head);
   ListNode* fast,*slow;
  fast=slow=head;
  if(head->next==NULL)//只有一个节点
  {
      free(head);
      head=NULL;
      return NULL;
  }
  //至少2个节点
  while(n--)
  {
    fast=fast->next;
  }
  if(fast==NULL)//删除头节点
  {
     head=head->next;
     return head;
  }
   while(fast->next)
   {
        fast=fast->next;
        slow=slow->next;
   }
 
  
   ListNode *del=slow->next;
   
  
    slow->next=del->next;
    free(del);
    del=NULL;
    return head;
}

优化快慢指针,引进头节点(哑节点)

 typedef struct ListNode ListNode;
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
   assert(head);
   ListNode* fast,*slow;
   ListNode*node=(ListNode*)malloc(sizeof(ListNode));
   node->next=head;
  fast=slow=node;
  int m=n+1;
  while(m--)
  {
      fast=fast->next;
  }
  while(fast)
  {
      fast=fast->next;
      slow=slow->next;
  }
  ListNode*del=slow->next;
    slow->next=del->next;
    free(del);
    del=NULL;
    return node->next;
}

解法二:遍历链表,找到链表节点数L,用删除指定位置节点方式删除第(L-n+1)个节点即可文章来源地址https://www.toymoban.com/news/detail-743850.html

到了这里,关于LeetCode 热题100——链表专题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • LeetCode 热题 100 | 链表(上)

    目录 1  基础知识 1.1  空指针 1.2  结构体 1.3  指针访问 1.4  三目运算符 2  160. 相交链表 3  206. 反转链表 4  234. 回文链表 菜鸟做题第三周,语言是 C++ 1  基础知识 1.1  空指针 使用 nullptr 来判断是否为空指针: “NULL 在 C++ 中就是 0,这是因为在 C++ 中 void* 类型是不允许隐式

    2024年02月19日
    浏览(40)
  • LeetCode热题100——链表

    给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回

    2024年02月05日
    浏览(41)
  • 【LeetCode热题100】【链表】两两交换链表中的节点

    题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode) 实际上是两个两个一组颠倒顺序,可以用k=2使用【LeetCode热题100】【链表】K 个一组翻转链表-CSDN博客 但可以更简单,就先看两个,先取第二个的指针,递归颠倒第二个后面的节点,链接到第一个节点上,然后把第一个节

    2024年04月13日
    浏览(69)
  • 【LeetCode 热题 100】图论 专题(bfs,拓扑排序,Trie树 字典树)

    from: https://leetcode.cn/studyplan/top-100-liked/ bfs 具有 边权为1 的最短路性质 拓扑排序,入度 Trie树, 高效存储 字符串【见鬼,不知道为什么写错,需要掌握熟练度】 dfs 写法,比较简洁 bfs 写法,有最短路性质 bfs 具有 边权为1 的最短路性质 拓扑排序 模板题 数组写法,简洁,需

    2024年02月13日
    浏览(49)
  • 【LeetCode热题100】打卡第33天:环形链表&LRU缓存

    大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种

    2024年02月15日
    浏览(43)
  • LeetCode 热题 100(五):54. 螺旋矩阵、234. 回文链表、21. 合并两个有序链表

    54. 螺旋矩阵 https://leetcode.cn/problems/spiral-matrix/ 题目要求:  思路:一定要 先找好边界 。如下图 ,上边界是1234,右边界是8、12,下边界是9、10、11,左边界是5,所以可以确定四个边界所包含的值。然后再 循环一层一层往里进入 ,比如添加完上边界1234后,上边界就需要+1,

    2024年02月12日
    浏览(51)
  • LeetCode 热题 100(四):48. 旋转图像、240. 搜索二维矩阵 II、234. 回文链表

    题目要求:就是一个顺时针的旋转过程。  思路:观察矩阵,得出翻转前第i行的第J个元素  等于  翻转后倒数第i列的第J个元素,举例说明,第1行第2个元素为“2”,翻转后到了 倒数第1列的第2个元素。说白了只需要针对翻转前的第i行和翻转后的倒数第i列 代码: 题目要求

    2024年02月11日
    浏览(34)
  • (链表专题) 725. 分隔链表 ——【Leetcode每日一题】

    给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长

    2023年04月17日
    浏览(40)
  • LeetCode 热题 100(七):105. 从前序与中序遍历序列构造二叉树、14. 二叉树展开为链表

    105. 从前序与中序遍历序列构造二叉树 https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 思路:依据前序遍历的根左右和中序遍历的左根右, 且根左长度=左根 代码: 14. 二叉树展开为链表 https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/ 思路:前序遍历

    2024年02月10日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包