day 8 链表相交|环形链表2

力扣

看题解后

链表相交,是指 指针相等 。

从相交节点开始,后面节点都是一样的

 所以求出链表的长度,求出差值,让长链表的指针移动,来让链表尾部对齐

求长度时,要注意 重新让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





};

力扣

看题解后

判断是否有环  寻找环的入口

定义快慢指针,如果相遇,有环

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
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值