1. 程式人生 > 其它 >LeetCode 0160 Intersection of Two Linked Lists

LeetCode 0160 Intersection of Two Linked Lists

原題傳送門

1. 題目描述

2. Solution 1

1、思路分析
設len(A) = m, len(B) = n; A與B共同的部分len = s;
m1 = m - s; n1 = n - s;
本題的關鍵是如何 處理 一般情況下: m1 != n1
方法一: 方案: 求和
鑑於 (m1 + s) + n1 = m + n1 = m1 + ( s + n1) = m1 + n
於是,以headA為出發點的pA走過 m + n1, 以headB為出發點的pB走過 n + m1,pA與pB即可在交叉點相遇

2、程式碼實現

package Q0199.Q0160IntersectionofTwoLinkedLists;

import DataStructure.ListNode;

public class Solution {
    /*
         設len(A) = m, len(B) = n; A與B共同的部分len = s;
          m1 = m - s; n1 = n - s;
          本題的關鍵是如何 處理 一般情況下: m1 != n1
       方法一: 方案: 求和
       鑑於 (m1 + s) + n1 = m + n1 =
            m1 + ( s + n1) = m1 + n
        於是,以headA為出發點的pA走過 m + n1, 以headB為出發點的pB走過 n + m1,pA與pB即可在交叉點相遇
      */
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) return null;
        ListNode pA = headA, pB = headB;
        while (pA != pB) {
            pA = pA != null ? pA.next : headB;
            pB = pB != null ? pB.next : headA;
        }
        return pA;
    }
}

3、複雜度分析
時間複雜度: O(n)
空間複雜度: O(1)

3. Solution 2

1、思路分析
方法二: 方案: 作差
設 L = max(m, n), S = min(m, n) -> d = L - S
長度為L的連結串列先走d步,然後與長度為S的連結串列齊步走,即可相遇

2、程式碼實現

package Q0199.Q0160IntersectionofTwoLinkedLists;

import DataStructure.ListNode;

public class Solution2 {
    /*
   方法二: 方案: 作差
   設 L = max(m, n), S = min(m, n) -> d = L - S
    長度為L的連結串列先走d步,然後與長度為S的連結串列齊步走,即可相遇
  */
    public int getLength(ListNode head) {
        int len = 0;
        while (head != null) {
            ++len;
            head = head.next;
        }
        return len;
    }

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) return null;
        int m = getLength(headA), n = getLength(headB);
        ListNode p, q;
        for (p = headA; m > n; m--) p = p.next;
        for (q = headB; m < n; n--) q = q.next;
        while (p != null && q != null && p != q) {
            p = p.next;
            q = q.next;
        }
        return (p != null && q != null) ? p : null;
    }
}

3、複雜度分析
時間複雜度: O(n)
空間複雜度: O(1)