首页 > 代码库 > [leetcode]Intersection of Two Linked Lists

[leetcode]Intersection of Two Linked Lists

问题描述:

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, returnnull.
  • 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.

Credits:
Special thanks to @stellari for adding this problem and creating all test cases.

基本思路:

考虑如果两个链表有交叉点,则到最后一定都是重合的节点,不会分开。

我们可以首先计算出每个链表的长度lenA,lenB。 diff为长链表比短链表长出的节点数。

让长链表先走diff步,然后两个链表同步向后走,检验节点是否想等,地一个想等的节点即为开始重合的位置。

代码:

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {  //C++
        
        int lenA =0,lenB = 0;
        
        ListNode *tmpA = headA;
        while(tmpA != NULL)
        {
            lenA++;
            tmpA = tmpA->next;
        }
        ListNode *tmpB = headB;
        while(tmpB != NULL)
        {
            lenB++;
            tmpB = tmpB->next;
        }
        
        tmpA = headA, tmpB =headB;
        
        int diff;
        if(lenA > lenB)
        {
            diff = lenA - lenB;
            while(diff > 0)
            {
                tmpA = tmpA->next;
                diff--;
            }
        }
        else
        {
            diff = lenB - lenA;
            while(diff > 0)
            {
                tmpB = tmpB->next;
                diff--;
            }
        }
        
        while(tmpA != tmpB)
        {
            tmpA = tmpA->next;
            tmpB = tmpB->next;
        }
        
        return tmpA;
    }


[leetcode]Intersection of Two Linked Lists