题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/

题目连接:https://leetcode-cn.com/problems/linked-list-cycle-ii/

题目大意

  具体按左神书上的描述来实现,空间复杂度 O(1) 解决有环单链表相交问题。

分析

  关于快慢指针能找到入环节点的一些说明强烈推荐这篇博客:https://blog.csdn.net/ffj0721/article/details/83302412

代码如下

 /**
* 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的更多相关文章

  1. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

  2. 【LeetCode】142. 环形链表 II

    142. 环形链表 II 知识点:链表:set:快慢指针 题目描述 给定一个链表,判断链表中是否有环. 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表 ...

  3. LeetCode 142:环形链表 II Linked List Cycle II

    给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 - ...

  4. [LeetCode题解]142. 环形链表 II | 快慢指针

    解题思路 本题是在141. 环形链表基础上的拓展,如果存在环,要找出环的入口. 如何判断是否存在环,我们知道通过快慢指针,如果相遇就表示有环.那么如何找到入口呢? 如下图所示的链表: 当 fast 与 ...

  5. LeetCode 141:环形链表 Linked List Cycle

    给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Given a l ...

  6. 【LeetCode】141.环形链表

    题目描述 141.环形链表 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中 ...

  7. C# 数据结构 - 单链表 双链表 环形链表

    链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...

  8. Leetcode 142题 环形链表 II(Linked List Cycle II) Java语言求解

    题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...

  9. leetcode题目142.环形链表Ⅱ(中等)

    题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...

随机推荐

  1. 一.jenkins安装(windows环境)

    前提:jdk等已安装 jenkins下载地址:https://jenkins.io/download/ 以我目前的知识记录两种启动方式: 1.直接下载war包 通过   java -jar jenki ...

  2. [STemWin教程入门篇] 第一期:emWin介绍

    转自:http://bbs.armfly.com/read.php?tid=1544 SEGGER公司介绍 了解emWin之前,先了解一下SEGGER这家公司,了解生产商才能对emWin有更加全面的认 ...

  3. AVL树,C语言实现,完整代码,先贴上,讲解稍后

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #de ...

  4. Tomcat启动脚本(1)startup.bat

    @echo off rem Licensed to the Apache Software Foundation (ASF) under one or more rem contributor lic ...

  5. dubbo的一些特性理解一下

    还有 启动检查.负载均衡.多协议支持 等 待总结

  6. [轉]Linux 2.6内核笔记【内存管理】

    4月14日 很多硬件的功能,物尽其用却未必好过软实现,Linux出于可移植性及其它原因,常常选择不去过分使用硬件特性. 比如 Linux只使用四个segment,分别是__USER_CS.__USER ...

  7. JS中的迭代(数组)

    啥子是迭代?可以简单地理解为按顺序访问目标(数组.对象等)中的每一项(其实和遍历概念没什么差别) 数组的迭代被我分为两种: 查找 遍历 查找: 1.indexOf(item,start) 该方法搜索指 ...

  8. LeetCode Array Easy 88. Merge Sorted Array

    Description Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted ar ...

  9. ARM 汇编与C之间 的调用

    一. 汇编调用 C 1. 初始化栈 2. 初始化BSS段 (BSS 段是C语言存放未初始化的全局变量,或者初始化为0 的全局变量) 3 .使用 r0 ,r1, r2, r3 给函数传参,如果多于  4 ...

  10. Android蓝牙自动配对Demo,亲测好使!!!(转)

    蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details ...