面试中常见链表问题10:交叉链表的第一个公共节点

来源:互联网 发布:手机百度软件下载 编辑:程序博客网 时间:2024/05/16 09:41
    给定两个链表,如果这两个链表相交,则返回第一个相交的顶点,如果不相交,则返回空。比如A:          a1 → a2                   ↘                     c1 → c2 → c3                   ↗            B:     b1 → b2 → b3则返回c1节点。    方法一:(1)求出链表l1和l2的长度。(2)较长的链表先走|l1-l2|步。(3)设置两个指针,直到两个指针相等时,返回结果。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB){if (headA == NULL || headB == NULL)return NULL;int len1 = 1;int len2 = 1;ListNode *p1 = headA;ListNode *p2 = headB;while (p1->next){len1++;p1 = p1->next;}while (p2->next){len2++;p2 = p2->next;}if (p1 != p2)return NULL;p1 = headA;p2 = headB;if (len1 > len2){int num = len1 - len2;while (num-- > 0){p1 = p1->next;}}else{int num = len2 - len1;while (num-- > 0){p2 = p2->next;}}while (p1 != p2){p1 = p1->next;p2 = p2->next;}return p1;}
方法二:(1)设置两个指针,判断两个指针是否为空,且是否相等。(2)两个指针每次都走一步,当l1指针为空时,则把l1设置为链表2的头指针,l2指针为空时,则把l2指针设置为链表1的头指针。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB){if(headA == NULL || headB == NULL)return NULL;ListNode *p1 = headA;ListNode *p2 = headB;while(p1 != NULL && p2 != NULL && p1 != p2){p1 = p1->next;p2 = p2->next;if(p1 == p2)return p1;if(p1 == NULL) p1 = headB;if(p2 == NULL) p2 = headA;}return p1;}
0 0