LC-相交链表(解法1)
链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/
描述:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
图示两个链表在节点 c1 开始相交:
思路:我们可以先获取两个链表的长度,以短的为准开始遍历两个链表,进行比较,当所指节点一样时,说明有相交,如果一直不相等则没有相交。
下面是获取链表长度的代码:
private int getLength(ListNode listNode) {
int length = 0;
while (listNode != null) {
length++;
listNode = listNode.next;
}
return length;
}
因为两个链表长度不一定一样,为了减少代码,我们写个通用的循环比较代码,认为headA比headB长:
private ListNode nodeValid(ListNode headA, ListNode headB) {
//获取开始比较的下标
int startIndex = getLength(headA) - getLength(headB);
int index = 0;
while (headA != null) {
// 下标一样开始比较
if (index == startIndex) {
if (headA == headB) {
return headA;
} else {
//不一样就后移一位
headA = headA.next;
headB = headB.next;
}
} else {
//还没有到比较的下标就让节点后移,下标加1
headA = headA.next;
index++;
}
}
return null;
}
下面是主方法代码:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
if (getLength(headA) >= getLength(headB)) {
return nodeValid(headA,headB);
}else {
return nodeValid(headB,headA);
}
}
此解法代码相对较多,容易理解一点,下一篇通过双指针求解。