[leetcode][list] Intersection of Two Linked Lists

来源:互联网 发布:金蝶进销存源码 编辑:程序博客网 时间:2024/05/16 09:12

题目:

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(NULL == headA || NULL == headB) return NULL;        //分别遍历两个链表到最后一个节点并记录链表长度lenA和lenB        ListNode *pA = headA;        ListNode *pB = headB;        int lenA = 1;        int lenB = 1;        while(pA->next){            ++lenA;            pA = pA->next;        }        while(pB->next){            ++lenB;            pB = pB->next;        }        //如果最后一个节点相等,则相交,否自,不相交        if(pA != pB) return NULL;        //两遍历指针都指向各自链表的第一个节点,较长链表的那个指针先走abs(lenA-lenB)步,然后两个指针同步后移,第一次指向同一个节点的时候他们所指的那个节点即为所求        ListNode *pLong = headA;        ListNode *pShort = headB;        int lenDiff = abs(lenA - lenB);        if(lenB > lenA){            pLong = headB;            pShort = headA;        }        for(int i = 0; i < lenDiff; ++i) pLong = pLong->next;        while(pLong != pShort){            pLong = pLong->next;            pShort = pShort->next;        }        return pLong;    }};


0 0
原创粉丝点击