LeetCode-160 intersection-of-two-linked-lists 相交連結串列
阿新 • • 發佈:2018-11-07
題目連結
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; } }