力扣(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步就不一定会有相遇的情况。


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


目录
相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
36 1
|
4天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
25 5
|
28天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
54 4
|
29天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
29天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
2月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
28天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
41 0
|
2月前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
24 0
|
2月前
|
存储
探索数据结构:便捷的双向链表
探索数据结构:便捷的双向链表
|
2月前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用