题目:
编写一个程序,找到两个单链表相交的起始节点。
思路:一个长链表一个短链表,求出两个链表的长度后确认哪个时longer,哪个是shorter,求出两个链表的长度差diff,先让长链表(longer)走diff步,再比较longer和shorter,如果不相交就各走一步,相交的话就返回longer,即找到了两个链表相交的结点
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
private int getLength(ListNode head) {//求链表长度的函数
int len = 0;
for (ListNode c = head; c != null; c = c.next) {
len++;
}
return len;
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int lenA = getLength(headA);//获取第一个链表的长度
int lenB = getLength(headB);//获取第二个链表的长度
ListNode longer = headA;
ListNode shorter = headB;
int diff = lenA - lenB;//两个链表的长度差
if (lenA < lenB) {//判断哪个链表长
longer = headB;
shorter = headA;
diff = lenB - lenA;
}
for (int i = 0; i < diff; i++) {
longer = longer.next;//走到这一步后长链表和短链表要走的步数相同
}
while (longer != shorter) {//当长链表与短链表不相交时,继续往下走
longer = longer.next;
shorter = shorter.next;
}
return longer;//直到长短链表相交,然后返回longer
}
}