c_cpp 160.两个链接列表的交集 - 简单 - 2018.8.6

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 160.两个链接列表的交集 - 简单 - 2018.8.6相关的知识,希望对你有一定的参考价值。

/**
1:把 LA 的尾巴链接到 LA 的头部,创造一个循环
2:按照题目 142 的解法来找到连接点
 */
 
class Solution {
public:
    ListNode *detectCycle( ListNode *head ) {
        ListNode *slow = head, *fast = head;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast) {
                ListNode *slow2 = head;
                while (slow2 != slow) {
                    slow2 = slow2->next;
                    slow = slow->next;
                }
                return slow2;
            }
        }
        return NULL;
    }
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == NULL || headB == NULL) return NULL;
        
        // 先制造一个 loop
        ListNode *tailNodeA = headA;
        while (tailNodeA->next != NULL) {
            tailNodeA = tailNodeA->next;
        }
        tailNodeA->next = headA;
                
        // 找链表相遇的节点
        ListNode *meetNode = detectCycle(headB);

        // 恢复现场
        tailNodeA->next = NULL;
        
        return meetNode;
    }
};

以上是关于c_cpp 160.两个链接列表的交集 - 简单 - 2018.8.6的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 交集,两个排序数组的并集

list的取差集

c_cpp 合并两个已排序的链接列表

c_cpp 添加由链接列表表示的两个数字

c_cpp 合并两个已排序的链接列表,使合并列表的顺序相反

c_cpp 比较表示为链接列表的两个字符串