LEETCODE 160

来源:互联网 发布:谭咏麟你知我知被禁 编辑:程序博客网 时间:2024/06/04 09:18

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.

考虑错了一个问题:

只要两个开始指向同一个地址,那么后面的肯定就相同了。有兴趣的可以画一下,比如同时指向C1,假设后面的不同,那么C1就需要指向两个不同的地方,但是C1的NEXT只有一个。


思路:

(1)首先对齐链表,将长的去头,因为相交不可能在前面,道理和前面一样,如果前面一样了,那么后面肯定一样。

(2)然后两两对比,直到找到相同的点。

/** * 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) {       int lenA = 0, lenB = 0;   ListNode* tempA = headA;   ListNode* tempB = headB;   while(tempA != NULL)   {   tempA = tempA->next;   ++lenA;   }   tempA = headA;   while(tempB != NULL)   {   tempB = tempB->next;   ++lenB;   }   tempB = headB; if (lenA > lenB) for (int i = 0; i < lenA - lenB; ++i)  tempA = tempA->next; if (lenB > lenA) for (int i = 0; i < lenB - lenA; ++i)  tempB = tempB->next;   while(tempA != tempB) { tempA = tempA->next; tempB = tempB->next; }     return tempA;    }};


0 0