编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
示例 2:
示例 3:
注意:
- 如果两个链表没有交点,返回
null
. - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
思路:计算出a,b链表的长度len1,len2, 然后让长的一个链表先走Math.abs(len1-len2), 然后再一起走
/**
* 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 aLen = getLen(headA);
int bLen = getLen(headB);
int len = Math.abs(aLen-bLen);
if(aLen>bLen) {
while(len>0) {
headA = headA.next;
len--;
}
while(headA!=null) {
if(headA==headB) {
return headA;
}
headA=headA.next;
headB=headB.next;
}
}else {
while(len>0) {
headB = headB.next;
len--;
}
while(headB!=null) {
if(headA==headB) {
return headA;
}
headA=headA.next;
headB=headB.next;
}
}
return null;
}
public int getLen(ListNode node) {
if(node==null ) {
return 0;
}
int res = 0;
while(node!=null) {
res++;
node=node.next;
}
return res;
}
}