編寫一個程序,找到兩個單鏈表相交的起始節點。
如下面的兩個鏈表:
在節點 c1 開始相交。
思路:類似快慢指針,即雙指針
—官方給的答案:
當p1到達鏈表尾時,讓p1 = headB
當p2到達鏈表尾時,讓p2 = headA
這樣一定有 p1 == p2
如果p1、p2有交點,那p1 == p2 && p1!=null
如果沒有,p1 == p2 && p1==null;
–分析原因:
我的原因不太對推薦看leetcode官方分析,但這種題,看了也不太好自我分析
-話說以前做過,但這次做第二次還是不會,分析原因真的有用嗎?
—怎麼判斷有交點,p1 == p2時
—如果兩鏈表長度相等,那可以出現p1 == p2
—如果兩鏈表不相等,那一次同時遍歷兩個鏈表不可以出現p1 == p2
—我往把同時改成分別那樣想了,但
—由於相交節點之前的長度不一樣,我們讓短的,類似於走的快的,走完後,去走長的那條路,讓長的,走完後,去走短的路,,倆指針距第一交點的長度都一樣了,那肯定可以相交。
流程圖真好用,一次通過,還可以幫助找bug
/**
-
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 p1 = headA;
ListNode p2 = headB;if(p1 == null || p2 == null) return null; int count1 = 1; int count2 = 1; while( p1!=p2){ p1 = p1.next; p2 = p2.next; if(p1 == null){ if(count1 == 1){ p1 = headB; count1++; }else{ return null; } } if(p2 == null){ if(count2 == 1){ count2++; p2 = headA; }else{ return null; } } } return p1;
}
}