题目

点击前往

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须保持其原始结构 。

解题思路

  • 简单来说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等。
  • 我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置。
  • 此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。
  • 否则循环退出返回空指针。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/

/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getListLen = function(head) {
let len = 0, cur = head;
while(cur) {
len++;
cur = cur.next;
}
return len;
}
var getIntersectionNode = function(headA, headB) {
let cur_headA = headA,cur_headB = headB;
let alen = getListLen(cur_headA),blen=getListLen(cur_headB);
if(alen < blen){
[cur_headA,cur_headB] = [cur_headB,cur_headA];
[alen,blen] = [blen,alen];
}
let i = alen - blen;
while(i-- > 0){
cur_headA = cur_headA.next;
}
while(cur_headA && cur_headA != cur_headB){
cur_headA = cur_headA.next;
cur_headB = cur_headB.next;
}
return cur_headA
};