题目描述:
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
该题是leetcode链表的简单题,思路:先比较两个链表的长度,将长的链表头指针移动到和短的链表对齐,然后同时遍历两个链表,若两个指针相等,则找到;反之返回null,没有找到相交起始节点。
代码如下:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int A_len = getLength(headA); //求链表A的长度
int B_len = getLength(headB); //求链表B的长度
if(A_len > B_len){ //如果链表A长,则先前移动到与B等长的位置
headA = forward(A_len, B_len, headA);
}else{ //如果链表B长,则先前移动到与A等长的位置
headB = forward(B_len, A_len, headB);
}
while(headA != null && headB != null){
if(headA == headB){ //当两指针指向同一个节点,则找到了
return headA;
}
headA = headA.next;
headB = headB.next;
}
return null;
}
//遍历链表,计算链表长度
public static int getLength(ListNode head){
int len = 0;
while(head != null){
len++;
head = head.next;
}
return len;
}
//长的链表向前移动
public static ListNode forward(int longLen, int shortLen, ListNode head){
int delta = longLen - shortLen;
while(head != null && delta != 0){
head = head.next;
delta--;
}
return head;
}
}