題目描述:
編寫一個程式,找到兩個單連結清單相交的起始節點。
如下面的兩個連結清單:
在節點 c1 開始相交。
示例 1:
傳回結果8;
思路:雙指針
我們不妨假設如果A和B不相交,那麼A與B在連結清單的最後null處相交(如下圖所示):
選擇兩個指針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;
}
}