给定两个链表,如果这两个链表相交,则返回第一个相交的顶点,如果不相交,则返回空。比如 A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 则返回c1节点。 方法一:(1)求出链表l1和l2的长度。(2)较长的链表先走|l1-l2|步。(3)设置两个指针,直到两个指针相等时,返回结果。方法二:(1)设置两个指针,判断两个指针是否为空,且是否相等。(2)两个指针每次都走一步,当l1指针为空时,则把l1设置为链表2的头指针,l2指针为空时,则把l2指针设置为链表1的头指针。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; }
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; }
面试中常见链表问题10:交叉链表的第一个公共节点
最新推荐文章于 2022-09-25 19:55:26 发布