编写一个程序,找到两个单链表相交的起始节点。
题目链接:相交链表
如下面的两个链表:
在节点 c1 开始相交。
解题思路:分两种情况:分别是长度相等和长度不相等
1)长度相等
2)长度不相等
计算两个链表的长度之差,让比较长的从头结点开始,向后移动长度只差步,此时两者到达同一起点,在进行节点的比较
/**
* 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) {
//1.计算两个链表的长度
int size1=size(headA);
int size2=size(headB);
//2.将长度比较长的链表向后移动与另一链表在同一起跑线
if(size1>size2){
int offset=size1-size2;
for(int i=0;i<offset;i++){
headA=headA.next;
}
}else{
int offset=size2-size1;
for(int i=0;i<offset;i++){
headB=headB.next;
}
}
//3.此时两者已经在同一起跑线上了,进行结点的比较(引用比较)
while(headA!=null&&headB!=null){
if(headA==headB){
return headA;
}
headA=headA.next;
headB=headB.next;
}
//没有交点
return null;
}
public int size(ListNode head){
int size=0;
ListNode cur=head;
while(cur!=null){
cur=cur.next;
size++;
}
return size;
}
}