创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多算法知识专栏:算法分析🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
LeetCode题解专栏:【LeetCode刷题笔记】
目录
- 题目链接
- 一、题目描述
- 二、示例
- 三、题目分析
- 四、代码实现(C/C++)
** **
题目链接
160.相交链表—力扣(LeetCode)
一、题目描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的 起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
二、示例
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at ‘8’
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。
三、题目分析
对链表的题目大多可以使用指针迭代进行解决,链表不允许被破坏,使用双指针对链表进行遍历。
A
和B
可以看作为两条链表,先使用p1指针
从A链表开始遍历,再使用p2指针
从B链表开始遍历,哪个指针先遍历到链表结尾,就代表哪个链表更长。
使用长链表的长度减去短链表的长度为这两条链表长度差,再利用长链表指针先出发这个长度差后,短链表的指针再出发,两个指针相遇的点就是两条链表的交点。
四、代码实现(C/C++)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int getlen(struct ListNode* head)
{
int len = 0;
while(head)
{
len++;
head=head->next;
}
return len;
}
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
if(headA==NULL||headB==NULL)return NULL;
int len1=getlen(headA);
int len2=getlen(headB);
//长链表指针先出发
if(len1>len2)
{
for(int i=0;i<(len1-len2);i++)
{
headA=headA->next;
}
}
else
{
for(int i=0;i<(len2-len1);i++)
{
headB=headB->next;
}
}
//再同时出发
while(headA!=NULL&&headB!=NULL)
{
if(headA==headB)
{
return headA;
}
headA=headA->next;
headB=headB->next;
}
return NULL;
}
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容! |
如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |