每日一题(11)——单链表常见问题

来源:互联网 发布:电力系统通信网络 编辑:程序博客网 时间:2024/04/27 15:44

一、单链表的存取

 

1.找出单链表的倒数第K个元素(仅允许遍历一遍链表)

两个指针fast,slow:
fast首先前进到第k个位置;然后两指针共同后移,直到fast到达末尾,slow所指元素即为所求。
 

2.找出单链表的中间元素(仅允许遍历一遍链表)

两个指针fast,slow:
fast每次后移2次,slow每次后移1次,直到fast到达末尾,slow所指元素即为所求。
 
都是利用指针追赶方法。
 
 

二、单链表与环的问题

 
 

1. 判断单链表是否有环(6形状)?

依然使用指针追赶方法:
两个指针fast,slow:从头指针(起点)开始,fast每次后移2次,slow每次后移1次,若相遇则两者存在环;若fast遇到NULL,则退出(不存在环,所以fast会遇到NULL)
 

2. 如何找到换入口?

由于fast和slow在碰撞点相遇时,slow走过的距离为(a+x),fast走过的距离为(a+2x+y),fast的前进路程是slow的2倍,所以,可以得出y=a;
因此:两个slow指针分别从起点和碰撞点开始移动,相遇点即为环入口 a。
 

3. 如何知道环的长度?

从碰撞点开始走,再次到达碰撞点,走过的路程即为环长s。
 

4. 求带环链表的长度?

L= a+s;
 
 

三、单链表与相交、环的问题

 

链表相交示意图:

1.如何知道两个单链表(无环)是否相交?

解法一:

不管三七二十一,直接测试第一个链表的每个元素是否在第二个节点中,时间O(L1*L2);

解法二:

若两个链表相交,则两个节点链表就会有共同节点。而节点地址又是节点的唯一标示。若我们可以判断两个链表中是否存在地址一致的节点,就可以知道两个链表是否相交。

对第一链表的节点地址进行hash排序,建立hash表,第二个链表的每个节点的地址查询hash表,若出现,则公共同节点。时间O(L1+L2)另附加O(L1)的储存空间。

 

以上两种方法都不尽如人意。

到底如何知道两个单链表(无环)是否相交?

(1).判断两链表最后一个节点是否相同,如果相交,则尾节点肯定是同一节点。
   时间复杂度O(length(A)+ length(B))、空间复杂度= O1
 
(2).人为构环
将链表A的尾节点指向链表B,如果B链表有环,则两个链表相交,此时从链表B的头指针往下遍历,如果能够回到B,则说明相交
时间复杂度O((length(A)+length(B)),没有额外的空间消耗 ( 是不是很BT啊~ 把A连到B,B就开始自转~就是因为A的尾其实就是B的尾嘛~ )

 

 2.如果两个单链表(无环)相交,如何知道它们相交的第一个节点是什么?

还是指针追赶:

(1)、先取得两个链表AB的长度lenA)和lenB
(2)、沿着AB链表中较长的链表遍历,使用指针追赶的方法。
设定两个指针fastslowfast先出发前进(lengthMax-lengthMin)步(即是二者的长度之差)使fastslow指针到相交点的距离相等,之后两个链表同时前进,每次一步,相遇的第一点即为两个链表相交的第一个点。(PS:这方法好无脑啊~)

 

3.如何知道两个单链表(有环)是否相交?

解法1:求出A的环入口,判断其是否在B链表上,如果在,则相交。

解法2:A链表上,  使用指针追赶的方法,找到两个指针碰撞点,之后判断碰撞点是否在B链表上。如果在,则相交  

 

4.如果两个单链表(有环)相交,如何知道它们相交的第一个节点是什么?

注,两个有环链表相交是指这个环属于两个链表共有

情况1相交的点,在环外
思路:使用指针追赶的方法。
求两个链表AB的长度LengthA)和LengthB
如果LengthA> LengthB),则链表A指针先走 LengthA-  LengthB),链表B指针再开始走,则两个指针相遇的位置就是相交的第一个节点。
如果 LengthA)< LengthB),则链表B指针先走 LengthB- LengthA),链表A指针再开始走,则两个指针相遇的位置就是相交的第一个节点。
 
情况2:相交的点,在环内,还不能处理

原创粉丝点击