题目:输入两个链表,找出它们的第一个公共节点。
思路一:
1. 分别设置一个指针,对链表进行遍历,求得这两个链表的长度差
d
d
d。
2. 较长的链表先遍历
d
d
d 个结点。
3. 较短的结点继续从头开始遍历,此时较长的链表也继续遍历,二者同时移动一步,比较二者指针指向的地址是否相同,而不是看结点的值是否相等。
java代码
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 如果两个链表都为空,返回空。
if(headB==null||headA==null) return null;
// 创立两个指针,分别指向表头。
ListNode cur1=headA,cur2=headB;
int n=0;
// 遍历链表1,并计算出其结点数量n
while(cur1!=null){
n++;
cur1=cur1.next;
}
// 遍历链表2,反向计算出其结点数量n
while(cur2!=null){
n--;
cur2=cur2.next;
}
// 如果n>0,说明链表1更长,如果n<0,说明链表2更长。
// cur1指向更长的表头。
cur1=n>0?headA:headB;
// 如果cur1指向的是表2,则cur2指向表1,如果cur1指向的是表1,则cur2指向表2。
cur2=cur1==headA?headB:headA;
// 保证两个链表的长度差是一个正值
n=Math.abs(n);
// 更长的链表先移动n步
while(n>0){
cur1=cur1.next;
n--;
}
// 二者同时移动,直到相等就停下。
while(cur1!=cur2){
cur2=cur2.next;
cur1=cur1.next;
}
// 返回其中一个即可。
return cur1;
}
}
// 写不到作者这么简洁。代码能力还有待加强呀!!!!!!
思路二:大神解法,实在是佩服。我只是知识的搬运工。