天天看點

Leetcode 刷題筆記----160.相交連結清單(連結清單)

題目描述:

編寫一個程式,找到兩個單連結清單相交的起始節點。

如下面的兩個連結清單:

Leetcode 刷題筆記----160.相交連結清單(連結清單)

在節點 c1 開始相交。

示例 1:

Leetcode 刷題筆記----160.相交連結清單(連結清單)

傳回結果8; 

思路:雙指針

我們不妨假設如果A和B不相交,那麼A與B在連結清單的最後null處相交(如下圖所示):

Leetcode 刷題筆記----160.相交連結清單(連結清單)

選擇兩個指針p1與p2分别指向A與B的頭節點;不管相交還是不相交,我們的最終目的是使p1與p2指向同一個節點(上圖的8以及這圖的null)。

思路很簡單,那就是使p1與p2将A鍊與B鍊都周遊一遍,這樣p1與p2周遊的節點數目就是一樣了!

具體詳見代碼所示:

​​/**
 * 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) {
        ListNode h1=headA,h2=headB;
        while(h1!=h2){ //當h1與h2相交的時候,傳回此節點。
            h1=h1==null?headB:h1.next; //如果周遊到連結清單尾部,h1指向連結清單B的頭節點。
            h2=h2==null?headA:h2.next;//如果周遊到連結清單尾部,h2指向連結清單A的頭節點。
        }
        return h1;
    }
}           

繼續閱讀