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 ListNode getIntersectionNode(ListNode headA, ListNode headB) { //注意,求长度时,可以利用尾节点是否相等进行剪枝,因此需要注意尾节点不能为null if(headA==null||headB==null) return null; int lenA=1; ListNode pA=headA; while(pA.next!=null){//判断条件,需要利用尾节点 lenA++; pA=pA.next; } int lenB=1; ListNode pB=headB; while(pB.next!=null){ lenB++; pB=pB.next; } if(pA!=pB) return null;//// pA=headA;//// pB=headB; if(lenA>lenB){ int step=lenA-lenB; for(;step>0;step--){ pA=pA.next; } } if(lenB>lenA){ int step=lenB-lenA; for(;step>0;step--){ pB=pB.next; } } while(pA!=null){ if(pA==pB) return pA; pA=pA.next; pB=pB.next; } return null; } }
时间: 2024-10-10 09:27:30