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.
Credits:
Special thanks to @stellari for adding this problem and creating all test cases.
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next = null; 9 * } 10 * } 11 */ 12 public class Solution { 13 public ListNode getIntersectionNode(ListNode headA, ListNode headB) { 14 if(headA == null || headB == null) return null; 15 ListNode ca = headA, cb = headB; 16 int cnta = 0, cntb = 0; 17 while(ca != null){ 18 cnta++; 19 ca = ca.next; 20 } 21 while(cb != null){ 22 cntb++; 23 cb = cb.next; 24 } 25 int sub = Math.abs(cnta - cntb); 26 if(cnta > cntb){ 27 while(sub > 0){ 28 headA = headA.next; 29 sub--; 30 } 31 }else{ 32 while(sub > 0){ 33 headB = headB.next; 34 sub--; 35 } 36 } 37 while(headA != headB){ 38 headA = headA.next; 39 headB = headB.next; 40 } 41 return headA; 42 } 43 }
时间: 2024-10-22 03:07:50