LeetCode ——160. 相交链表,142. 环形链表 II
创始人
2024-04-07 05:12:24

✅<1>主页:C语言的前男友
📃<2>知识讲解:LeetCode经典链表笔试题目
🔥<3>创作者:C语言的前男友
☂️<4>开发环境:Visual Studio 2022
🏡<5>系统环境:Windows 10
💬<6>前言:今天来讲解几个经典的链表题目,链接已经给出大家可以挑战一下。

目录

160. 相交链表

题目链接:160. 相交链表

题目描述:

 思路一:

代码:

思路二:

代码:

142. 环形链表 II

题目链接:142. 环形链表 II

题目描述:

思路一:

 代码:

思路二:

代码:

 最后:成为自己想成为的样子,才能得到自己想得到的东西。


160. 相交链表

题目链接:160. 相交链表

题目描述:

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交

 思路一:

如果两个链表相交,则必有公共结点,我们只需要返回第一个公共结点就可以了,第一个公共结点就是第一个相交结点。怎么找他的第一个公共结点呢?最简单的就是两个循环,去遍历两个链表。用链表B中的结点挨个与链表A的结点比较是否相等。如果存在相等的结点,第一个相等的结点就是两个单链表相交的起始节点,返回任意一个结点。如果没有相交结点,那么两个链表不相交,返回 NULL 。此方法时间复杂度为O(n^2).

代码:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{for(struct ListNode*i=headA;i!=NULL;i=i->next){for(struct ListNode*j=headB;j!=NULL;j=j->next){if(i==j){return i;}}}return NULL;
}

思路二:

如果让两个指针能从下面的地方开始走,那么两个指针相遇的时候一定就是两个单链表相交的起始节点。

 那么问题就是怎么找到这两个位置。其实不难发现只要让 curB 先走,让 curB 之后的链表节点数与 curA 后面的节点数一样。只要让长的链表先走 长链表比短链表多的节点数的 步数,就可以了。

代码:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode*listA=headA;struct ListNode*listB=headB;int countA=0; //A链表的长度int countB=0; //B链表的长度//计算B链表的长度while(listA) {countA++;listA=listA->next;}//计算A链表的长度while(listB){countB++;listB=listB->next;}//计算长度差int n=abs(countA-countB);//先假设A为长链表,B为短炼表struct ListNode*longlist=headA;struct ListNode*shortlist=headB;//如果不符合就纠正一下if(countB>countA){longlist=headB;shortlist=headA;}//让长链表先走while(n--){longlist=longlist->next;}//长短链表同时走while(longlist&&shortlist){//第一次相遇就是相交的第一个结点if(longlist==shortlist){return longlist;}longlist=longlist->next;shortlist=shortlist->next;}return NULL;
}

142. 环形链表 II

题目链接:142. 环形链表 II

题目描述:

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

 

思路一:

利用带环链表的特点加上严格的逻辑推导:

 代码:

struct ListNode *detectCycle(struct ListNode *head){struct ListNode*frist=head;//快指针struct ListNode*slow=head;//慢指针//如果遇到结点为空,就说明不是带环结点,直接返回NULLwhile(frist&&frist->next){frist=frist->next->next; //快指针一次走两步slow=slow->next; //慢指针一次走一步if(frist==slow)//在环中相遇{struct ListNode*meet=frist;//一个从环中走struct ListNode*cur=head;//一个从链表头走while(meet!=cur)//相遇是循环结束{meet=meet->next;cur=cur->next;}return meet;//相遇的结点就是环入口点}}return NULL;}

思路二:

利用快慢指针,让两指针在环中相遇点,将相遇点拆开。相遇点的后一个结点变成新的头节点,相遇点的next指向NULL。这样带环问题就变成了,两个链表相交的问题。

产生的两条新的链表,head 和 phead  ,两条链表相交的第一个的以公共结点就是,以前带环链表的环入口处。

代码:

//找到链表相交的第一个结点
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode*listA=headA;struct ListNode*listB=headB;int countA=0;int countB=0;while(listA){countA++;listA=listA->next;}while(listB){countB++;listB=listB->next;}int n=abs(countA-countB);struct ListNode*longlist=headA;struct ListNode*shortlist=headB;if(countB>countA){longlist=headB;shortlist=headA;}while(n--){longlist=longlist->next;}while(longlist&&shortlist){if(longlist==shortlist){return longlist;}longlist=longlist->next;shortlist=shortlist->next;}return NULL;
}
struct ListNode *detectCycle(struct ListNode *head)
{struct ListNode*frist=head;struct ListNode*slow=head;while(frist&&frist->next){frist=frist->next->next;slow=slow->next;//快慢指针在环中相遇if(frist==slow){//拆分环行链表段struct ListNode*phead=frist->next;slow->next=NULL;//返回相交结点return getIntersectionNode(phead,head);}}return NULL;
}

 最后:成为自己想成为的样子,才能得到自己想得到的东西。

 

 

 

 

 

 

 

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...