「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
兄弟们!偶是大熊。。。
今天带大家看看 链表相交这道题
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的 起始节点。如果两个链表没有交点,返回 null 。
如图: 相交起始节点就是C1
这个题目的解题思路有很多种最简单的莫过于暴力双循环了
var getIntersectionNode = function(headA, headB) {
var cloneA = headA
var cloneB = headB
while(cloneA){
while(cloneB){
if(cloneA === cloneB){
return cloneB
}
cloneB = cloneB.next
}
cloneA = cloneA.next
cloneB = headB
}
return null
};
双指针,真个方法代码量最少
如果链表一样长且有交点,则第一次遍历就能找到相同交点,返回。如图:
如果不一样长且有交点,则指针遍历一条链表后,遍历另一条链表
如:A链表的指针遍历完A了,下一步继续遍历B链表。B链表的指针遍历完B了,下一步继续遍历A链表。
如图所示,由于
a+c+b=b+c+a,所以两个指针在第二次遍历的时候,一定会在相交节点处相遇。
如果没有交点,则第二次遍历结束都是null,遍历结束,返回null
a+b=b+a,最终一定都会指向null。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
var A = headA;
var B = headB;
while(A !== B){
A = A === null ? headB : A.next;
B = B === null ? headA : B.next;
}
return A
};
最后,我再提出一个方法,你们来实现
把链表A和链表B 翻转之后 得到俩个新的链表
然后判断新链表的第一个值... 剩下的留着你们自己思考!!!
加油兄弟们。 生命不熄,代码不止!!!