leetcode之链表类之相交成环类-----OJ 160/141/142 链表相交 链表环

来源:互联网 发布:数据在被 编辑:程序博客网 时间:2024/06/14 01:40

1、OJ160,两个 链表是否相交判断

O(N * M)的判断方式

OJ160代码:

class Solution {public:    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {        if (!headA || !headB) {            return nullptr;        }                for (ListNode *p = headA; p; p = p->next) {            for (ListNode *q = headB; q; q = q->next) {                if (p == q) {                    return p;                }            }        }                return nullptr;    }};

2、OJ141 OJ142 链表环问题

判断一个链表是否成环

链表环知识汇总:

1、如何判断是否成环:快慢指针法,如果成环则快慢指针必相遇

2、如成环,入口点在哪:再弄两个指针,一个在head,一个在相遇点,然后同步走,相遇时所在节点就是入口节点

3、环长度:从入口点走,直到回到入口点,即走了环的一圈的长度

OJ141代码:

class Solution {public:    bool hasCycle(ListNode *head) {        ListNode *l1 = head, *l2 = head;        while (l1 && l2 && l1->next && l1->next->next) {            l1 = l1->next->next;            l2 = l2->next;            if (l1 == l2) {                return true;            }        }                return false;    }};

OJ142代码:

class Solution {public:    ListNode *detectCycle(ListNode *head) {        if (!head) {            return nullptr;        }                ListNode *l1 = head, *l2 = head;        while (l1 && l2 && l1->next && l1->next->next) {            l1 = l1->next->next;            l2 = l2->next;            if (l1 == l2) {                break;            }        }                if (l1 && l1->next && l1->next->next) {            l2 = head;            while (l2 != l1) {                l2 = l2->next;                l1 = l1->next;            }            return l1;        } else {            return nullptr;        }    }};


原创粉丝点击