很简单。
自己的解法:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null){
return null;
}
ListNode runnerA = headA;
ListNode runnerB = headB;
int stepNumA = 0;
int stepNumB = 0;
while(runnerA.next != null){
runnerA = runnerA.next;
stepNumA ++;
}
while(runnerB.next != null){
runnerB = runnerB.next;
stepNumB ++;
}
if (runnerA != runnerB){
return null;
}else{
runnerA = headA; runnerB = headB;
if (stepNumB > stepNumA){
for(int i = 0; i < stepNumB - stepNumA; i ++) runnerB = runnerB.next;
}else{
for(int i = 0; i < stepNumA - stepNumB; i ++) runnerA = runnerA.next;
}
while(runnerA != runnerB){
runnerA = runnerA.next;
runnerB = runnerB.next;
}
return runnerA;
}
}
}
非常精妙的别人的解法:https://discuss.leetcode.com/topic/38444/simple-c-solution-5-lines
Move cur1 (cur2) forward from headA (headB) and loop back to headB (headA), eventually cur1 and cur2 will meet at the intersection point or nullptr.
因为两个指针绕一圈的距离是一样的,所以最终一定会在intersection point相交
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *cur1 = headA, *cur2 = headB;
while(cur1 != cur2){
cur1 = cur1?cur1->next:headB;
cur2 = cur2?cur2->next:headA;
}
return cur1;
}