LEETCODE: Intersection of Two Linked Lists

来源:互联网 发布:女性职场歧视 知乎 编辑:程序博客网 时间:2024/06/05 03:51

Write a program to find the node at which the intersection of two singly linked lists begins.


For example, the following two linked lists:

A:          a1 → a2                   ↘                     c1 → c2 → c3                   ↗            B:     b1 → b2 → b3

begin to intersect at node c1.


Notes:

  • If the two linked lists have no intersection at all, return null.
  • The linked lists must retain their original structure after the function returns.
  • You may assume there are no cycles anywhere in the entire linked structure.
  • Your code should preferably run in O(n) time and use only O(1) memory.

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {        if(headA == NULL || headB == NULL)            return NULL;                // Find the length of list A and record the last node of list A.        int lenA = 1;        ListNode *lastA = headA;        while(lastA != NULL && lastA->next != NULL) {            lenA ++;            lastA = lastA->next;        }                // Find the length of list B and record the last node of list B.        int lenB = 1;        ListNode *lastB = headB;        while(lastB != NULL && lastB->next != NULL) {            lenB ++;            lastB = lastB->next;        }                // No intersaction.        if(lastA != lastB)            return NULL;                // Skip the front nodes of the longer list, then move with the same speed.        // The first time the two cursors meet is the intersaction node.        lastA = headA;        lastB = headB;        if(lenA > lenB) {            lenA -= lenB;                        for(int ii = 0; ii < lenA; ii ++) {                lastA = lastA->next;            }        }        else {            lenB -=lenA;            for(int ii = 0; ii < lenB; ii ++) {                lastB = lastB->next;            }        }                while(lastA != NULL && lastB != NULL && lastA != lastB) {            lastA = lastA->next;            lastB = lastB->next;        }        return lastA;    }};



0 0