LeetCode 160. Intersection of Two Linked Lists

来源:互联网 发布:g96恒线速度编程实例 编辑:程序博客网 时间:2024/06/05 09:40

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 || !headB) return NULL;        ListNode* node;        int len1 = 0, len2 = 0;        node = headA;        while(node){            len1 ++;            node = node -> next;        }        node = headB;        while(node){            len2 ++;            node = node -> next;        }        if(len1 > len2){            int count = len1 - len2;            while(count --)                headA = headA -> next;        }        else if(len1 < len2){            int count = len2 - len1;            while(count --)                headB = headB -> next;        }        while(headA && headB){            if(headA == headB) return headA;            headA = headA -> next;            headB = headB -> next;        }        return NULL;            }};


0 0