暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

相交链表

码农历险技 2019-11-06
304

这道题因为两个链表的长度不一样,所以它们到达相交点的起点不一样,如果同时移动两个链表指针遍历链表,那么很大概率会找不到相交点,所以这道题就变成如何使它们到相交点的起点相同,起点相同之后再同时移动两个链表的指针就可以找到解了。

思路很简单,只要分别求出两个链表的长度,

再用较长的长度lenB减去较短的长度lenA得到差值diff,然后让较长的链表先走diff步,这样一来他们的起点就相同了。

然后就可以同时让A和B每次移动指针比较直到A和B指向的节点相等就可以了。

/**
* 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) {
if(headA==null || headB==null) return null;
if(headA==null && headB==null) return null;
int lenA=0; //链表A长度
int lenB=0; //链表B长度
ListNode a=headA;
ListNode b=headB;
//求出headA的长度
while(a!=null){
lenA++;
a=a.next;
}
//求出headB的长度
while(b!=null){
lenB++;
b=b.next;
}
a=headA;
b=headB;
//判断哪个链表比较长
if(lenA>lenB){
int diff=lenA-lenB;
//先让headA走diff步
for(int i=1;i<=diff;i++){
a=a.next;
}
}else{
int diff=lenB-lenA;
//先让headB走diff步
for(int i=1;i<=diff;i++){
b=b.next;
}
}
while (a != null) {
if (a == b) return a;
else {
a = a.next;
b = b.next;
}
}
return null;
}
}

LeeCode上运行结果:



文章转载自码农历险技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论