leetcode160 相交連結串列(讓兩個連結串列從同距離末尾同等距離的位置開始遍歷,當較長的連結串列指標指向較短連結串列head時,長度差就消除了)

海米傻傻發表於2024-06-05

題目描述

https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

給你兩個單連結串列的頭節點 headAheadB ,請你找出並返回兩個單連結串列相交的起始節點。如果兩個連結串列不存在相交節點,返回 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;
    }
}

相關文章