1. 程式人生 > >LeetCode-160 intersection-of-two-linked-lists 相交連結串列

LeetCode-160 intersection-of-two-linked-lists 相交連結串列

題目連結

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

題意

        中文題,不過該題不是官方提供,所以不支援在LeetCode上設定資料跑,所以連自己測都不行,比acm刺激多了(手動滑稽)。這個題就是給兩個連結串列頭,判定這兩個連結串列是否相交。並且返回相交點的節點物件。

題解

        據說是面試經典連結串列題了,這個題如果新增一個前置條件:兩個連結串列的長度一定相等。瞬間就簡單了許多:直接遍歷倆連結串列,如果某個結點一樣,就是相交結點了,輸出就行。而題目沒有這個條件,那麼我們手動處理一下就可以了,把比較長的連結串列多出來的部分擷取就可以了,並且絕對不會從最後截(因為後部分是合併部分)。並且如果合併絕對不會再分開(突然腦洞想起來一下,太蛋疼了不存在的)。

        那麼我們先遍歷一趟兩個連結串列,並且統計長度,求差以後,對相對較長的連結串列先遍歷,將多餘的部分給過濾掉,然後就按照長度相等的兩個連結串列來分析了。

        這裡有一些剪枝的方法:在第一次遍歷長度的時候,如果最後一個節點是不相等的,那麼一定不相交。如果其中有一個連結串列頭為空,也絕對不相交(因為只有一個連結串列)。

        另外,不用考慮兩個連結串列相等的情況,如果求差是0,那麼過濾的時候就等於一個節點就沒過濾掉,所以不用單獨判定相等。

Java 程式碼

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int len1 = 1;
        int len2 = 1;
        ListNode initA = headA;
        ListNode initB = headB;
        if(headA == null || headB == null) return null;
        while(headA.next != null){
            len1++;
            headA = headA.next;
        }
        while(headB.next != null){
            len2++;
            headB = headB.next;
        }
        if(headA != headB) return null;
        headA = initA;
        headB = initB;
        int mul = Math.abs(len1 - len2);
        if(len1 > len2){
            while(mul-- != 0){
                headA = headA.next;
            }
        }else{
            while(mul-- != 0){
                headB = headB.next;
            }
        }
        while(headA != headB){
            headA = headA.next;
            headB = headB.next;
        }
        return headA;
    }
}