微软100题(7) 判断两链表是否相交

来源:互联网 发布:知乎清华五道口 编辑:程序博客网 时间:2024/06/15 01:49

题目:

给出两个单链表的头指针h1 h2,判断两个链表是否相交

思路:

1.如果两个链表都没有环:

       如果相交:则尾结点一定一样

       如果不相交,尾结点不一样

2.一个有环,一个无环,则一定不相交

3.两个都有环,

      如果相交,则环为同一个环

      如果不相交,则环不一样

首先需要判断是否有环

struct  ListNode{int m_value;ListNode* m_pnext;}ListNode;bool JudgeCircle(ListNode* head){if(head == NULL) return false;ListNode* slow = head;ListNode* fast = head->m_pnext;while(slow && fast){slow = slow->m_pnext;fast = fast->m_pnext->m_pnext;if(slow == fast) return true;}return false;}
然后,如果有环就需要找到环里面的一个结点,然后判断这个结点在不在另一个链表里

寻找一个环里的结点:

ListNode* FindOneNode(ListNode* head)//已经判断出链表有环{if(head == NULL) return NULL;ListNode* p1 = head;ListNode* p2 = head->m_pnext;while (p1 && p2){p1 = p1->m_pnext;p2 = p2->m_pnext->m_pnext;if(p1 == p2) return p1;}return NULL;}

判断该结点在不在另一个有环的链表里面

bool IsExistInList(ListNode* head2,ListNode* pNode){ListNode* p1 = head2;ListNode* p2 = head2->m_pnext;ListNode* pTemp = nullptr;while(p1 && p2){p1 = p1->m_pnext;p2 = p2->m_pnext->m_pnext;if(p1 == p2) {pTemp = p1;break;}}if(pNode == pTemp) return true;p1 = p1->m_pnext;while(p1!=pTemp){if(p1 == pNode) return true;p1 = p1->m_pnext;}return false;}


0 0
原创粉丝点击