开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
前言
本系列文章主要会总结一些常见的算法题目以及算法的易错点,难点,以及一些万用的公式,并且结合实际的 Leetcode 题目来进行加深理解以及实际应用,算法这种东西,属于是一到用时方恨少的类型,在平时总结一些常见的简单算法,经常磨练自己的算法思维,对于日常的开发还是能有不少的帮助的。
- 今天来介绍一下如何判断链表相交
怎么判断链表相交
下面是一个正常的链表,里面有四个元素,最后指向null
假设有另一个链表从结点3开始和它相交,如下图所示
我们肉眼来看当然是很容易就能够看出来两个链表有相交的部分,但是放在代码当中,要怎么去判断两个链表是否相交,并且交点在哪个位置呢
我们可以从链表的后面开始往前判断,因为两个链表一但相交,那么后面的部分就一定是完全一样的,所以我们可以让两个链表尾部对齐,从短的链表的头结点开始往下遍历,一旦碰到两个链表对应的位置是一样的节点的时候,那么这里就是我们要找的相交点。
值得注意的是,题目中的相等是节点相等不是值相等,也就是两个节点当前所在的位置相等。
关于代表节点当前的位置,我们可以用双指针来表示,并且双指针就可以对比两个链表的长度,用来实现前面说的,将两个链表通过尾部对齐,由短的链表的头节点开始向下遍历去寻找相同节点。
Leetcode 面试题 02.07. 链表相交
按照上面的思路来实现这道题,判断两个节点是否相等,直接用三等号就可以判断,并且一开始优先计算出两个链表的长度,这样既可以确定谁是短的链表,还是算出两个链表长度的差值,以此来决定指针要从哪里开始遍历。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
function getIntersectionNode(headA, headB) {
let sizeA = 0;
let sizeB = 0;
let A = headA;
let B = headB;
while (A) {
sizeA++;
A = A.next;
}
while (B) {
sizeB++;
B = B.next;
}
A = headA;
B = headB;
if (sizeA < sizeB)
[sizeA, sizeB] = [sizeB, sizeA];
[A, B] = [B, A];
}
let difference = sizeA - sizeB;
while (difference-- && A) {
A = A.next;
}
while (A && B) {
if (A === B) {
return A;
}
A = A.next;
B = B.next;
}
return null;
};