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/**
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <em id= "__mceDel" > * 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) { if (headA== null || headB== null ) return null ; //我用的是判断环的方法,碰撞点开始到连接点的长度=head到连接点的长度。<br> //一种更好的方法是线计算出2个链表的长度再移动节点。 ListNode moveA=headA; ListNode moveB=headB; ListNode lastA= null ; while (moveA!= null && moveA.next!= null ) moveA=moveA.next; while (moveB!= null && moveB.next!= null ) moveB=moveB.next; if (moveA!=moveB) return null ; else { lastA=moveA; moveA.next=headB; } ListNode slow=headA.next; ListNode fast=headA.next.next; while (slow!=fast){ slow=slow.next; fast=fast.next.next; } moveB=slow; moveA=headA; while (moveA!=moveB){ moveA=moveA.next; moveB=moveB.next; } lastA.next= null ; return moveB; } } </em> |
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.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步