LeetCode 0160 Intersection of Two Linked Lists
阿新 • • 發佈:2022-05-25
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)