题目描述: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.
解题思路:两个链表如果在某个结点相同,后继节点一定也是相同的,所以应该从尾节点到较短节点的长度的位置开始扫描是否相同。
Java代码实现:
/**
* 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) {
int sizeA=0,sizeB=0;
ListNode pA=headA,pB=headB;
if(headA==null||headB==null) return null;
while(pA!=null) {
sizeA++;
pA=pA.next;
}
while(pB!=null) {
sizeB++;
pB=pB.next;
}
pA=headA;
pB=headB;
if(sizeA>sizeB){
for(int i=0;i<Math.abs(sizeA-sizeB);i++){
pA=pA.next;
}
}
else if(sizeA<sizeB){
for(int i=0;i<Math.abs(sizeA-sizeB);i++){
pB=pB.next;
}
}
while(pA!=null&&pB!=null){
if(pA==pB) return pA;
pA=pA.next;
pB=pB.next;
}
return null;
}
}
原题题目:
https://leetcode.com/problems/intersection-of-two-linked-lists/