Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public int getListLength(ListNode N){ int n = 0; ListNode p = N; while(p != null){ n++; p = p.next; } return n; } public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode intersect = null; ListNode pA = headA; ListNode pB = headB; int A = getListLength(headA); int B = getListLength(headB); if(A >= B){ int m = A-B; while(m != 0){ pA = pA.next; m--; } } else{ int m = B-A; while(m != 0){ pB = pB.next; m--; } } while(pA != null){ if(pA == pB){ intersect = pA; break; } else{ pA = pA.next; pB = pB.next; } } return intersect; } }
思路很简单,长的链表先移动指针至和短的链表“同一起跑线”,然后同时移动指针并比较是否相同。