链表习题-力扣oj (附加思路版)

LCR 140. 训练计划 IIhttps://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/

给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 cnt 个训练项目编号。

思路:双指针,快指针先走cnt步然后快慢指针同时向前走,当快指针为空时慢指针所在位置即为倒是第cnt个编号

cpp 复制代码
class Solution {
public:
    ListNode* trainingPlan(ListNode* head, int cnt) {
       ListNode *fast=head,*slow=head;
       for(int i=1;i<=cnt;i++)
       fast=fast->next;
       while(fast)
       {
           fast=fast->next;
           slow =slow->next;
       }
       return slow;
    }
};

141. 环形链表https://leetcode.cn/problems/linked-list-cycle/

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回 true 。 否则,返回 false

思路:双指针,一个快指针一个慢指针,快指针每次走两步 (有风险:快指针可能为要特殊处理一下)慢指针走一步。如果两个指针能相遇则有环,如果不能相遇则没有环

cpp 复制代码
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode *fast=head,*slow=head;
      while(fast&&fast->next){
          fast=fast->next->next;
          slow=slow->next;
          if(fast==slow)
            return 1;
      }
      return false;
    }
};

26. 删除有序数组中的重复项https://leetcode.cn/problems/remove-duplicates-from-sorted-array/

给你一个 非严格递增排列 的数组 nums ,请你**原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k

思想:双指针,快指针如果与慢指针相等快指针++,当快指针不等于慢指针时,慢指针++快慢赋值给慢指针,然后快指针++。直到快指针遍历完数组结束。

cpp 复制代码
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
      int fast=1,slow=0;
     if(nums.size()==1)
        return 1;
     while(fast<nums.size())
     {
         if(nums[fast]==nums[slow])
            fast++;
         else
         {
            slow++;
            nums[slow]=nums[fast];
            fast++;
         }
     }
     return slow+1;
    }
};

53. 最大子数组和https://leetcode.cn/problems/maximum-subarray/

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。

思路:将数组和与最大和比较,如果数组和大于最大和则更新,否则最大和加下一位数组元素判断有没有当前最大和大。

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int max=INT_MIN;
        int sum=0;
        for(int i=0;i<nums.size();i++)
        {
            sum+=nums[i];
            if(sum>max)max=sum;
            if(sum<0)sum=0;
        }
        return max;
    }
};

876. 链表的中间结点https://leetcode.cn/problems/middle-of-the-linked-list/

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

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

思路:快指针走两步慢指针走一步

cpp 复制代码
class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* fast=head,*slow =head;
        while(fast&& fast->next)
        {
            fast=fast->next->next;
            slow=slow->next;
        }
        return slow;
    }
};

21. 合并两个有序链表https://leetcode.cn/problems/merge-two-sorted-lists/

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

思路:当头节点和中间节点的处理方式不同时手动添加一个虚头节点****,

cpp 复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        //创建虚头节点
         ListNode* Head = new ListNode();
         ListNode* Tail = Head;
         while(l1 && l2)
         {
             if(l1->val<=l2->val)
             {
                 Tail->next=l1;
                 l1=l1->next;
             }
             else
             {
                 Tail->next=l2;
                 l2=l2->next;
             }
             Tail=Tail->next;
         }
        //判断剩余
         if(l1) Tail->next=l1;
         if(l2) Tail->next=l2;
         return Head->next;
    }
};
相关推荐
南东山人2 小时前
一文说清:C和C++混合编程
c语言·c++
清炒孔心菜5 小时前
每日一题 LCR 078. 合并 K 个升序链表
leetcode
Ysjt | 深5 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__5 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
Microsoft Word5 小时前
c++基础语法
开发语言·c++·算法
一只小小汤圆6 小时前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
legend_jz6 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
嘿BRE6 小时前
【C++】几个基本容器的模拟实现(string,vector,list,stack,queue,priority_queue)
c++
ö Constancy7 小时前
c++ 笔记
开发语言·c++