題目描述
https://leetcode.cn/problems/intersection-of-two-linked-lists/description/
給你兩個單連結串列的頭節點
headA
和 headB
,請你找出並返回兩個單連結串列相交的起始節點。如果兩個連結串列不存在相交節點,返回 null
。圖示兩個連結串列在節點 c1
開始相交: 圖示兩個連結串列不存在相交節點
題目資料 保證 整個鏈式結構中不存在環。
注意,函式返回結果後,連結串列必須 保持其原始結構 。
進階:你能否設計一個時間複雜度 O(m + n)
、僅用 O(1)
記憶體的解決方案?
思路分析
問題轉化:假如讓兩個連結串列從同距離末尾同等距離的位置開始遍歷就好了。
問題分析:兩個連結串列相交,相交點之後的長度是相同的,相交點之前的長度差如何消除?
問題解答:當較長的連結串列指標指向較短連結串列head時,長度差就消除了
分情況討論
一、兩個連結串列在節點c1
開始相交
a1->a2->c1->c2->c3->null->b1->b2->b3->c1
b1->b2->b3->c1->c2->c3->null->a1->a2->c1
二、兩個連結串列不存在相交節點
2->6->4->null->1->5->null
1->5->null->2->6->4->null
程式碼實現
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { 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 ? headB : pA.next; pB = pB == null ? headA : pB.next; } return pA; } }