单链表相交

来源:互联网 发布:交易训练软件 编辑:程序博客网 时间:2024/05/23 00:21

给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回false。

给定两个链表的头结点head1head2(注意,另外两个参数adjust0adjust1用于调整数据,与本题求解无关)。请返回一个bool值代表它们是否相交。

思路:找到两个链表进入环的第一个节点:1、都为空,两个都无环

           2、一个为空无环,另一个不为空有环,必然不相交          

           3、都不为空,两个都有环,判断是否相交

/*struct ListNode {    int val;    struct ListNode *next;    ListNode(int x) : val(x), next(NULL) {}};*/class ChkIntersection {public:    bool chkInter(ListNode* head1, ListNode* head2, int adjust0, int adjust1) {        ListNode *pos1=head1,*pos2=head2;        pos1=chkLoop(head1);        pos2=chkLoop(head2);        if(pos1==NULL&&pos2==NULL) {//都为空,两个都无环            return chkIntersect(head1,head2);//看无环单链表是否相交        }        //一个为空无环,另一个不为空有环,必然不相交        else if((pos1==NULL&&pos2!=NULL)||(pos1!=NULL&&pos2==NULL)){            return false;        }else{      //都不为空,两个都有环,判断是否相交            if(pos1==pos2) return true;            ListNode *p=pos1->next;            while(p!=pos1){                 if(p==pos2) return true;                 p=p->next;            }            return false;        }    }    //找到进入环的第一个节点    ListNode*  chkLoop(ListNode* head) {     //快慢指针第一次相遇时,把快指针重新指回头结点后以1的速度再次遍历必然在环内初始节点与慢指针相遇         ListNode *slow=head;           ListNode *fast=head;         while(fast!=NULL&&fast->next!=NULL){               slow=slow->next;               fast=fast->next->next;               if(slow==fast){                   fast=head;                 while(fast!=slow){                     slow=slow->next;                       fast=fast->next;                   }                 return fast;             }           }           return NULL;//跳出循环说明没有环    }      //判断两个无环单链表的最后一个节点是否相同来判断两个链表是否相交    bool chkIntersect(ListNode* headA, ListNode* headB) {        ListNode *p1=headA,*p2=headB;        while(p1->next){//链表1从头节点开始,走到最后一个节点              p1=p1->next;        }        while(p2->next){//链表2从头节点开始,走到最后一个节点              p2=p2->next;        }        if(p1==p2)            return true;        else            return false;//遍历到最后,如果curA!=curB,说明两个链表不相交     }};


原创粉丝点击