力扣(LeetCode)数据结构练习题(3)------链表

简介: 力扣(LeetCode)数据结构练习题(3)------链表

今天又是刷题的一天,今天给又给大家分享两道题目,两题相较昨天的两题还是挺有思考意义的,虽然对大佬来说还是简单的,但对于我们这种新手小白还是挺有练习价值的,小白可以跟我一起来看看哟。


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


仔细审题不难理解这里就是要我们把两个链表给链接起来,但是这里需要注意的是题目明确要求要通过给定的节点来组成,不能创建新的节点来完成。

那么下面我写一下参考答案:


这里运用尾插法,就是不断寻找两个链表当前节点val 的值哪个更小,哪个小就尾插哪个即可。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    
if(list1==NULL)
{
    return list2;
}
 
if(list2==NULL)
{
    return list1;
}
 
struct ListNode* phead=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* tail=phead;
 
while(list1 && list2)
{
if(list1->val > list2->val)
{
    tail->next=list2;
    tail=list2;
    list2=list2->next;
}
else
{
 
tail->next=list1;
tail=list1;
list1=list1->next;
 
}
}
 
if(list1)
{
    tail->next=list1;
}
 
 
if(list2)
{
    tail->next=list2;
}
 
struct ListNode* new=phead->next;
free(phead);
return new;
 
}
 
 
 
 
 
 
 


代码解析:


当list1和 list2 中任意一个为空时返回另一个即可。


这里我们创建一个哨兵头,这个后面是要销毁的,为了不用特地再找开始第一个tail,到底是两个链表中的首个val,可以直接将哨兵头作为长链表开始的尾即tail=phead。然后后面的就是简单的尾插,即找到两个链表节点哪个值小然后尾插到长链表中,最后就可以将链表连接成功了。


给你一个链表的头节点 head ,判断链表中是否有环。


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


如果链表中存在环 ,则返回 true 。 否则,返回 false


审题过后我们就知道题目要求我们判断一个链表中是否有循环部分,如果有返回true,否则返回false。那么现在我们的难点就是如何判断出一个链表是否有环,这里我的方法就是快慢指针法。

下面是我的方法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    
struct ListNode* fast=head;
struct ListNode* slow=head;
while(fast && fast->next)
{
 
fast=fast->next->next;
slow=slow->next;
 
if(fast==slow)
{
return true;
}
 
 
 
}
 
 
return false;
 
 
}


代码解析:这里我的快慢还是使用一个是一次走一个节点,另一个走两个节点,那么只要在这个链表中如果存在循环那么,快的指针迟早追上慢的指针,那么有人会问追上就一定是有slow==fast吗?答案是如果快慢指针一个走一步,一个走两步那是一定会出现slow==fast的情况。 至于为什么下面在给大家解析:


大家先假设一下环的长度为C,那么如果我们快慢指针为快指针走2步,慢指针走1步,那么他们的每一步距离差距都是1,在没进入环之前是距离加一,进入环后他们走一步就是距离减一,我们可以看下图:

如图这样最后可以相遇的,但是如果快指针一次走3步,而慢的一次走1步就不一定会有相遇的情况。


好了今天文章到这。望多多支持。


目录
相关文章
|
1月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
78 1
|
1月前
|
分布式计算 算法 Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本文讲解了两道经典的图论问题:**岛屿数量(LeetCode 200)** 和 **腐烂的橘子(LeetCode 994)**,分别通过 DFS/BFS 实现。在“岛屿数量”中,利用深度或广度优先搜索遍历二维网格,标记连通陆地并计数;“腐烂的橘子”则采用多源 BFS,模拟腐烂传播过程,计算最短时间。两者均需掌握访问标记技巧,是学习网格搜索算法的绝佳实践。
71 1
|
2月前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
221 14
|
1月前
|
Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本篇博客详细解析了三道经典的动态规划问题:198. 打家劫舍(线性状态转移)、279. 完全平方数与322. 零钱兑换(完全背包问题)。通过 Go 语言实现,帮助读者掌握动态规划的核心思想及其实战技巧。从状态定义到转移方程,逐步剖析每道题的解法,并总结其异同点,助力解决更复杂的 DP 问题。适合初学者深入理解动态规划的应用场景和优化方法。
47 0
|
1月前
|
算法 Go 索引
【LeetCode 热题100】回溯:括号生成 & 组合总和(力扣22 / 39 )(Go语言版)
本文深入解析了LeetCode上的两道经典回溯算法题:**22. 括号生成**与**39. 组合总和**。括号生成通过维护左右括号数量,确保路径合法并构造有效组合;组合总和则允许元素重复选择,利用剪枝优化搜索空间以找到所有满足目标和的组合。两者均需明确路径、选择列表及结束条件,同时合理运用剪枝策略提升效率。文章附有Go语言实现代码,助你掌握回溯算法的核心思想。
64 0
|
3月前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
83 4
|
3月前
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
90 10
|
3月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
116 10
|
5月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
146 30
|
5月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
209 25