【力扣hot100】相交链表 - 双指针

18 阅读1分钟

Problem: 160. 相交链表

思路

你选用何种方法解题?

解题过程

这些方法具体怎么运用? 如果有相同的节点,那么尾部一定是对其的 可以先找到链表长度的差值,然后同步向后移动 如果找到一样的节点则说明有相交,没有找到就没有相交

复杂度

  • 时间复杂度: O(∗)O(*)O(∗)
  • 空间复杂度: O(∗)O(*)O(∗)
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function getIntersectionNode(headA: ListNode | null, headB: ListNode | null): ListNode | null {
    if(headA==null||headB==null){
        return null;
    }
    // 首先计算链表长度,如果有相交我们希望可以尾部对齐
    let len1 = 0,len2 = 0;
    let tmp1:ListNode = headA;
    while(tmp1) {
        len1++;
        tmp1 = tmp1.next;
    }
    tmp1 = headB;
    while(tmp1){
        len2++;
        tmp1 = tmp1.next;
    }
    let s1:ListNode = headA;
    let s2:ListNode = headB;

    if(len1 >= len2){
        let m = len1 - len2;
        while(m){
            s1 = s1.next;
            m--;
        }
    }else{
        let m = len2 - len1;
        while(m){
            s2 = s2.next;
            m--;
        }
    }

    while(s1!=null){
        if(s1==s2){
            return s1;
        }
        s1=s1.next;
        s2=s2.next;
    }
    return null;


};