看题解后
链表相交,是指 指针相等 。
从相交节点开始,后面节点都是一样的
所以求出链表的长度,求出差值,让长链表的指针移动,来让链表尾部对齐
求长度时,要注意 重新让cur 指向头节点,因为cur指向的不是头节点了。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getListLen = function(head) {
let len = 0, cur = head;
while(cur) {
len++;
cur = cur.next;
}
return len;
}
var getIntersectionNode = function(headA, headB) {
// 求两个链表交点 交点不是数值相等 而是指针相等 从交点开始后面都重合
// 让curA移动到和curB对齐的位置
// 求链表A的长度
let lenA=0,lenB=0
let curA=headA,curB=headB
while(curA){
lenA++
curA=curA.next
}
while(curB){
lenB++
curB=curB.next
}
// 这里得重新让curA=headA 因为上面已经让curA不是headA了
curA=headA,curB=headB
// 让curA为最长链表的头,lenA为其长度
if(lenA<lenB){
// 交换变量注意要加;
// 两个数组交换变量在同一个作用域下时
// 如果不加分号,下面两条代码等同于一条代码: [curA, curB] = [lenB, lenA]
[curA,curB]=[curB,curA];
[lenA,lenB]=[lenB,lenA];
}
let i = lenA-lenB;
// while(i-->0){
// //少了个>0 不然会一直遍历下去 知道读取null 不对
// curA = curA.next;
// }
while(i-- > 0) { // 让curA和curB在同一起点上(末尾位置对齐)
curA = curA.next;
}
while(curA&&curA!==curB)
{
curA=curA.next
curB=curB.next
}
return curA
};
看题解后
判断是否有环 寻找环的入口
1
定义快慢指针,如果相遇,有环
2(计算总结得到)
从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var detectCycle = function(head) {
// 判断是否有环 怎么找到环的入口
// 快慢指针相遇 在环内
let fast=head,slow=head
while(fast!=null&&fast.next!=null){
slow=slow.next
fast=fast.next.next
if(slow===fast){
// 快慢指针相遇 真么找到环的入口 head 相遇点 两个指针相遇 则是入口
let index1 = fast,index2=head
while(index1!=index2){
index1=index1.next
index2=index2.next
}
return index2//返回环的入口
}
}
return null
};