设计链表
一、LeetCode题解
瞧一瞧~
- 博健的LeetCode题解:Gitbook版本传送门
- 博健的LeetCode题解:CSDN传送门
- 前端进阶笔记:Gitbook传送门
二、算法题
题目
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果有环,则确定它的入口位置。
注意:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
解法一(双指针)
思路
- 定义A、B节点对应headA、headB链表
- 如果两个链表相交,那么他们的共同点就是相交节点及以后的节点相等;
- 在未知长度的链表中,为了保证两个节点走相同的路程。
- A节点走完后,走B节点,假设A链表交点前的节点数尾a
- B节点走完后,走A节点,假设A链表交点前的节点数尾b
- 如果存在交点:A和B在相遇前都走了
a+共同节点+b
,此时A === B
代码
var getIntersectionNode = function(headA, headB) {
var A = headA
var B = headB
while(A || B){
if(A === B) return A
A = A ? A.next : headB
B = B ? B.next : headA
}
return null
};