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 ...
随机推荐
- 一.jenkins安装(windows环境)
前提:jdk等已安装 jenkins下载地址:https://jenkins.io/download/ 以我目前的知识记录两种启动方式: 1.直接下载war包 通过 java -jar jenki ...
- [STemWin教程入门篇] 第一期:emWin介绍
转自:http://bbs.armfly.com/read.php?tid=1544 SEGGER公司介绍 了解emWin之前,先了解一下SEGGER这家公司,了解生产商才能对emWin有更加全面的认 ...
- AVL树,C语言实现,完整代码,先贴上,讲解稍后
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #de ...
- Tomcat启动脚本(1)startup.bat
@echo off rem Licensed to the Apache Software Foundation (ASF) under one or more rem contributor lic ...
- dubbo的一些特性理解一下
还有 启动检查.负载均衡.多协议支持 等 待总结
- [轉]Linux 2.6内核笔记【内存管理】
4月14日 很多硬件的功能,物尽其用却未必好过软实现,Linux出于可移植性及其它原因,常常选择不去过分使用硬件特性. 比如 Linux只使用四个segment,分别是__USER_CS.__USER ...
- JS中的迭代(数组)
啥子是迭代?可以简单地理解为按顺序访问目标(数组.对象等)中的每一项(其实和遍历概念没什么差别) 数组的迭代被我分为两种: 查找 遍历 查找: 1.indexOf(item,start) 该方法搜索指 ...
- LeetCode Array Easy 88. Merge Sorted Array
Description Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted ar ...
- ARM 汇编与C之间 的调用
一. 汇编调用 C 1. 初始化栈 2. 初始化BSS段 (BSS 段是C语言存放未初始化的全局变量,或者初始化为0 的全局变量) 3 .使用 r0 ,r1, r2, r3 给函数传参,如果多于 4 ...
- Android蓝牙自动配对Demo,亲测好使!!!(转)
蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details ...