LeetCode 相交链表&环形链表II
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
题目连接:https://leetcode-cn.com/problems/linked-list-cycle-ii/
题目大意
分析
代码如下
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *loopA = detectCycle(headA), *loopB = detectCycle(headB);
int lenA, lenB; if(loopA == NULL && loopB == NULL) { // 两个链表都没有环
lenA = getLen(headA);
lenB = getLen(headB); // 长链表先走,然后再一起走
ListNode *pA = headA, *pB = headB;
if(lenA > lenB) for(int i = ; i < lenA - lenB; ++i) pA = pA->next;
else for(int i = ; i < lenB - lenA; ++i) pB = pB->next; while(pA != pB) {
pA = pA->next;
pB = pB->next;
} return pA;
}
else if(loopA != NULL && loopB != NULL) { // 两个链表都有环
if(loopA == loopB) { // 和都没有环的情况一样,只不过终点不是NULL了
lenA = getLen(headA, loopA);
lenB = getLen(headB, loopB); ListNode *pA = headA, *pB = headB;
if(lenA > lenB) for(int i = ; i < lenA - lenB; ++i) pA = pA->next;
else for(int i = ; i < lenB - lenA; ++i) pB = pB->next; while(pA != pB) {
pA = pA->next;
pB = pB->next;
} return pA;
}
else {
ListNode *p = loopA->next; while(p != loopA) {
if(p == loopB) return loopA; // 相交但入环点不同
p = p->next;
}
return NULL; // 不相交
}
}
return NULL; // 一个有环一个没环,一定不相交
} // 如果链表无环,返回 NULL,否则返回第一个入环节点
ListNode *detectCycle(ListNode *head) {
if(head == NULL || head->next == NULL || head->next->next == NULL) return NULL; ListNode *slow = head->next, *fast = head->next->next; while(fast != slow) {
if(fast->next == NULL || fast->next->next == NULL) return NULL;
fast = fast->next->next;
slow = slow->next;
} slow = head;
while(fast != slow) {
fast = fast->next;
slow = slow->next;
} return slow;
} int getLen(ListNode *head, ListNode *end = NULL) {
int ret = ;
while(head != end) {
++ret;
head = head->next;
}
return ret;
}
};
LeetCode 相交链表&环形链表II的更多相关文章
- 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II
[算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...
- 【LeetCode】142. 环形链表 II
142. 环形链表 II 知识点:链表:set:快慢指针 题目描述 给定一个链表,判断链表中是否有环. 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表 ...
- LeetCode 142:环形链表 II Linked List Cycle II
给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 - ...
- [LeetCode题解]142. 环形链表 II | 快慢指针
解题思路 本题是在141. 环形链表基础上的拓展,如果存在环,要找出环的入口. 如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环.那么如何找到入口呢? 如下图所示的链表: 当 fast 与 ...
- LeetCode 141:环形链表 Linked List Cycle
给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Given a l ...
- 【LeetCode】141.环形链表
题目描述 141.环形链表 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中 ...
- C# 数据结构 - 单链表 双链表 环形链表
链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...
- Leetcode 142题 环形链表 II(Linked List Cycle II) Java语言求解
题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...
- leetcode题目142.环形链表Ⅱ(中等)
题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...
随机推荐
- 优化问题及KKT条件
整理自其他优秀博文及自己理解. 目录 无约束优化 等式约束 不等式约束(KKT条件) 1.无约束优化 无约束优化问题即高数下册中的 “多元函数的极值" 部分. 驻点:所有偏导数皆为0的点: ...
- 7、c++版,在大学学的编程基础知识
1.各种排序 #include<iostream> using namespace std; //-------直接插入排序 void InsertSort(ElemType A[],in ...
- Go 语言变量、常量
变量 第一种,指定变量类型,声明后若不赋值,使用默认值. var v_name v_type v_name = value 第二种,根据值自行判定变量类型. var v_name = value 第三 ...
- 1005 -- I Think I Need a Houseboat
I Think I Need a Houseboat Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 105186 Acc ...
- vue aliasConfig(模块别名配置)
今天研究了下鹏哥搭建的项目代码,一个人捣鼓了半天模块别名配置,边写边测试,才慢慢明白,所有写下来当个笔记: 在vue项目中,经常根据需要引入不同的功能模块,默认情况下我们通过代码 import mod ...
- 【记录】Windows host配置域名
程序员开发中可能会需要域名访问程序,说白了就是修改hosts文件,过程如下: 1:找到本机hosts文件路径一般位置在: C:\Windows\System32\drivers\etc 2:右键编辑h ...
- redis底层相关命令(一)
说明 用于分析redis底层数据结构以及内存情况 底层数据结构分析 1.查看key键的对象类型type key 本地:>sadd test1 本地:>type test1 set 2.查看 ...
- Vue学习笔记【5】——如何定义一个基本的Vue代码结构
插值表达式{{}} 和 v-text 默认 v-text 是没有闪烁问题的: v-text会覆盖元素中原本的内容,但是 插值表达式只会替换自己的这个占位符,不会把 整个元素的内容清空 v-cloak ...
- vma
linux内核的每一样技术,都是为了解决某个问题的. vma结构体的提出是为了管理"虚拟内存空间"这个资源. 像brk(),mmap()分配给用户空间的都是虚拟地址(当然),那内核就要知道哪一部分虚拟 ...
- 一场comet常规赛的台前幕后
有出题的想法大概是#8比完之后,#8的比赛较易,应该是符合https://info.cometoj.com 上的常规赛难度说明. 我们几个觉得我们一定可以出质量更高的题. 那个时候在玩线段树的时碰巧想 ...