一开始试着用DP去解决, 可是两个指针怎么同步移动很费劲,想了一会脑子混乱,就建立双向linked list,思路就很清晰了。
/**
* 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 curA = headA, preA = headA, nexA = null;
ListNode curB = headB, preB = headB, nexB = null;
if(curA == null || curB == null) return null;
while(curA != null && curA.next != null){
preA.next = nexA;
nexA = preA;
preA = curA.next;
curA = curA.next;
}
while(curB != null && curB.next != null){
preB.next = nexB;
nexB = curB;
curB = curB.next;
preB = curB;
}
if(preA == preB){
while(preA == preB && preA != null && preB != null && preA.next != null && preB.next != null ){
preA = preA.next;
preB = preB.next;
}
return preA;
}
else return null;
}
}
结果: 报错! No intersection, ERROR: linked structure was modified. 不该修改链表结构
别人de思路 用两个指针分别从headA 和 headB,通过跳转到另一个达到第二次遍历的时候 两个指针能指向对映的位置。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode curA = headA, curB = headB;
if(curA == null || curB == null) return null;
while(curA != curB){
curA = curA == null ? headB : curA.next;
curB = curB == null ? headA : curB.next;
}
return curA;
}
}