LeetCode 160. 相交链表 Intersection of Two Linked Lists (Easy)

Posted zsy-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 160. 相交链表 Intersection of Two Linked Lists (Easy)相关的知识,希望对你有一定的参考价值。

 

编写一个程序,找到两个单链表相交的起始节点。力扣

 

解法一:剑指offer中思路,先计算两个链表长度(lengthA, lengthB),然后长链表先走(lengthA-lengthB)步后,两个链表一起走,相等节点即为要找的节点。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        
        if (headA == nullptr || headB == nullptr)  //无效输入
            return nullptr;

        ListNode *pNodeA = headA, *pNodeB = headB;
        int lengthA = 0, lengthB = 0;

        for (; pNodeA != nullptr; ++lengthA)  //计算链表A长度
            pNodeA = pNodeA->next;
        for (;pNodeB != nullptr; ++lengthB)  //计算链表B长度
            pNodeB = pNodeB->next;

        int diff = lengthA - lengthB;  //此处默认链表A更长
        pNodeA = headA;  //记得重新赋值,这里忘掉了
        pNodeB = headB;
        if (diff < 0)  //否则交换
        {
            diff = lengthB - lengthA;
            pNodeA = headB;
            pNodeB = headA;
        }

        for (int i = 0; i < diff; ++i)  //长链表先走
            pNodeA = pNodeA->next;

        while (pNodeA != pNodeB && pNodeA != nullptr && pNodeB != nullptr)  //两个链表节点相等时跳出
        {
            pNodeA = pNodeA->next;
            pNodeB = pNodeB->next;
        }

        return pNodeA;
    }
};

 

解法二:思路类似于上述代码。

技术图片

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        
        ListNode *pNodeA = headA, *pNodeB = headB;
        while (pNodeA != pNodeB)
        {
            pNodeA = (pNodeA == nullptr) ? headB : pNodeA->next;
            pNodeB = (pNodeB == nullptr) ? headA : pNodeB->next;
        }
        return pNodeA;
    }
};

如果只是判断是否存在交点,有两种解法:

  • 把第一个链表的结尾连接到第二个链表的开头,看第二个链表是否存在环;
  • 或者直接比较两个链表的最后一个节点是否相同。

以上是关于LeetCode 160. 相交链表 Intersection of Two Linked Lists (Easy)的主要内容,如果未能解决你的问题,请参考以下文章

优雅永不过时——leetcode106 相交链表

优雅永不过时——leetcode106 相交链表

LeetCode 160. 相交链表

LeetCode 160.相交链表

leetcode 160.相交链表

[JavaScript 刷题] 链表 - 相交链表, leetcode 160