关于相交链表、带环链表、链表深拷贝的思路整理

返回相交链表的交点:1.先求出两个链表的各自长度
2.让长的先走他们的(长度差)步
3.然后两者同时走,第一次相遇就是交点(返回该结点)

判断链表是否带环:1.快慢指针(快的走两步,慢的走一步,不能一个一步,一个n步(N>2),可能会错过)
2.如果两个指针相遇,则链表带环;如果快的遇到null,则不带环(直线形)

求入环点:
1).转化为相交问题(求取相遇结点)
2).一个从起点,一个从交点,都每次走一步,第一次相遇点为入环点

相交+带环(六种情况)

复杂链表的复制
1)简单复制无法解决(因为是浅拷贝)
2)先复制结点,再考虑random问题
3)如果能从老的结点中找到新的结点问题好解决

结构:
1.老-新-老-新...
2.处理random
3.拆开

原文地址:https://blog.51cto.com/14232658/2424110

时间: 2024-11-05 22:41:59

关于相交链表、带环链表、链表深拷贝的思路整理的相关文章

判断两个链表是否相交(带环)

解决方案: 1.找出链表1的环入口节点a1,链表2的环入口节点a2; 2.如果a1=a2; 说明两个链表可能在入环之前或者入环第一个节点相交:将a1,a2作为两个链表的最后一个节点,转化为不带环的链表相交:其实在这种情况下已经说明两个链表已经相交了. 3.如果a1!=a2;以a1为基准节点进行while循环,如果在循环中找到跟a2相同的节点,说明两个链表相交:如果没找到,说明不相交. #如果1个链表不带环,1个链表带环:则两个链表必不相交:

寻找带环的链表的柄长

试题:给定一个带环的链表,找出环起点.比如:A -> B -> C -> D -> E -> C (C为环形起点)写一个程序找出环起点C. ListNode结构如下,请实现 ListNode* find_circle_beginning(ListNode* head);函数,返回环的起点. struct ListNode { char val; ListNode* next; }; 答案: 1.先用快指针(每次走两步)和慢指针(每次走一步),遍历链表,当两个指针相遇时,说明该

1.6带环单链表

检测单链表中是否有环 方法一:蛮力法 定义一个集合用来存放结点的引用,并将其初始化为空,从链表的头结点开始向后遍历,每遍历到一个结点就判断集合中是否有这个结点的引用,如果没有,说明这个结点是第一次访问,还没有形成环,那么将这个结点的引用添加到集合中去.如果在集合中找到了同样的结点,那么说明这个结点已经被访问过了,于是就形成了环.这种方法的时间复杂度为O(n),空间复杂度也为O(n). 方法二 : 快慢指针遍历法 定义两个指针fast(快)与slow(慢),二者的初始值都指向链表头,指针slow每

c/c++单链表面试题—链表带环问题

1.判断一个单链表是否带环 思路解析: 判断一个单链表是不是带环,就看在遍历单链表的时候能不能遍历完成,如果带环的话会陷入死循环程序一直无法结束,但是这种判断方法在程序的实现是不可能的.所以转换一种思路,利用两个遍历速度不同的指针遍历,如果存在环的话,那么快指针迟早会追上慢指针.通过这个判断程序实现起来是比较简单可行的. 单链表的结构体及其类的定义 struct Node { public: Node(const DataType& d) :_data(d) ,_next(NULL) {} pu

带环单链表

判断单链表是否带环: 定义两个快慢指针,快指针每次走两步,慢指针每次走一步,然后判断是否两个指针相遇.若相遇,则带环. 设慢指针走过的路程为s,则快指针走过的路程即为2s. 设从环头结点到环的入口点的距离为a. 设从环的入口点到两指针相遇点的距离为x. 设环的长度为m.快指针走了n圈. 由数学关系式可得:s = a + x    2s = a + n*m + x; 则  n*m = a + x; a = n*m - x; 求环的入口点方法:定义连个指针,一个指针从环的头结点开始走,另一个指针则从

带环链表的入口

带环的单链表: 如上图,List 为一个带有环的单链表,环的大小为5: 证明: S 为 slow 指针相遇前走的距离,2S 为 fast 指针相遇前走过的距离: ∵ 2S = S + n*R;        //n slow,fast指针相遇前 fast 多经历的圈数  S = H_I + R1: ∴S = n*R; ∴n*R = H_I  + R1; ∵ R1 + R2 = R; ∴(n-1)*R = H_I - R2; ∴(n-1)*R + R2 = H_I;       //结论:(交点到

[PHP] 算法-请找出带环链表的环的入口结点的PHP实现

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了 2.原理有点像上面的,定义两个指针,一个是快指针每次走两步,一个是慢指针每次走一步,当两个相遇的时候,假设环的长度为n个结点,慢指针走x步,快指针走2x步,2x=x+kn ;x=kn; k暂时假定为1圈 ,也就是慢指针slow

Python与数据结构[0] -> 链表[0] -> 单链表与带表头单链表的 Python 实现

单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利用Python来完成单链表的实现. 1 单链表 不带表头的单链表通常形式如下, node_1 -> node_2 -> node_3 -> node_4 完整代码 1 class Node: 2 def __init__(self, val=None, nxt=None): 3 self.v

C语言强化(七)链表相交问题_3 判断链表是否带环

前两篇讨论的前提都是链表是无环的,但是如果链表有环呢? 显然,如果链表有环,那么之前的寻找链表尾结点的函数将陷入死循环,之前的算法也将崩掉. 所以对于链表相交的问题,首先要判断的是链表是否有环. 题目 给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交 解题步骤 判断两个[无环]链表是否相交 找到两个[无环]链表的相交结点 判断链表是否带环 判断两个[有环]链表是否相交 找到两个[有环]链表的相交结点 思路 用两个指针,一个指针步长为1,一个指针步长为2,若最后相遇,则链表有环