LeetCode 链表相交

107 阅读2分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

兄弟们!偶是大熊。。。

今天带大家看看 链表相交这道题

LeetCode地址

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

如图: 相交起始节点就是C1

image.png

这个题目的解题思路有很多种最简单的莫过于暴力双循环


    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
};

双指针,真个方法代码量最少

如果链表一样长且有交点,则第一次遍历就能找到相同交点,返回。如图:

image.png

如果不一样长且有交点,则指针遍历一条链表后,遍历另一条链表
如:A链表的指针遍历完A了,下一步继续遍历B链表。B链表的指针遍历完B了,下一步继续遍历A链表。

image.png 如图所示,由于a+c+b=b+c+a,所以两个指针在第二次遍历的时候,一定会在相交节点处相遇。

如果没有交点,则第二次遍历结束都是null,遍历结束,返回null
a+b=b+a,最终一定都会指向null。

image.png

/**
 * 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 翻转之后 得到俩个新的链表

然后判断新链表的第一个值... 剩下的留着你们自己思考!!!

加油兄弟们。 生命不熄,代码不止!!!