LeetCode 160. 相交链表

题目描述:

编写一个程序,找到两个单链表相交的起始节点。

 

例如,下面的两个链表

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

在节点 c1 开始相交。

 

注意:

  • 如果两个链表没有交点,返回 null.
  • 在返回结果后,两个链表仍须保持原有的结构。
  • 可假定整个链表结构中没有循环。
  • 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

 

思路:我们首先遍历两个链表,获得两个链表的长度,然后先遍历长的链表,直到遍历到两个链表等长的时候再一起遍历,遇到的第一个相同的节点就是起始节点。

/**
 * 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(nullptr == headA || nullptr == headB) return nullptr;
        
        int lenA = 1, lenB = 1;
        ListNode *pA = headA, *pB = headB;
        while(pA->next){
            pA = pA->next;
            lenA++;
        }
        while(pB->next){
            pB = pB->next;
            lenB++;
        }

        //先知道两个的长度,然后从两个开始的时候开始遍历
        if(pA != pB) return nullptr;
        pA = headA;
        pB = headB;
        if(lenB > lenA){
            int rest = lenB - lenA;
            while(rest--){
                pB = pB->next;
            }
        }
        else if(lenB < lenA){
            int rest = lenA - lenB;
            while(rest--){
                pA = pA->next;
            }
        }
        
        while(pA != pB){
            pA = pA->next;
            pB = pB->next;
        }
        return pA;
    }
};

 

你可能感兴趣的:(LeetCode,LeetCode)