leetcode[160] Intersection of Two Linked Lists

那几题要15刀才能测试的就先放着了。先吧可以在线测试的刷了。

这题是找到零个链表的相交的那个节点。如果没有相交,那就返回NULL。

思路一:

如果有相交,那么他们相交点之后的节点肯定都是共有的,然后两个链表有长有短的话,就先把长的读到和短的一样长,然后两个人在同时走,走到第一个相同的点就是答案了。如果相同的点是NULL了,那就是没有相交点。

/**
 * 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) {
        ListNode *l1 = headA, *l2 = headB;
        if (!headA || !headB) return NULL;
        int cnt1 = 0, cnt2 = 0;
        while(l1)
        {
            cnt1++; l1 = l1 -> next;
        }
        while(l2)
        {
            cnt2++; l2 = l2 -> next;
        }
        if (cnt1 > cnt2)
        {
            l1 = headA; l2 = headB;
            int tmpcnt1 = cnt1 - cnt2;
            while(tmpcnt1-- > 0)
                l1 = l1 -> next;
        }
        else
        {
            l2 = headB; l1 = headA;
            int tmpcnt2 = cnt2 - cnt1;
            while(tmpcnt2-- > 0)
                l2 = l2 -> next;
        }
        while(l1 && l2 && l1 != l2)
        {
            l1 = l1 -> next;
            l2 = l2 -> next;
        }
        if (l1 == l2)
            return l1;
        return NULL;
    }
};

思路二:

因为两个链表长度可能不一样长,所以不能从第一次走一样的距离判断相交点,但是。可以这样,两个链表同时走,走到末尾后,分别将指针跳到另一个链表的开头,这样,他们第一次相同的点就是答案了。

/**
 * 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) {
        ListNode *l1 = headA, *l2 = headB;
        if (!headA || !headB) return NULL;
        while(l1 && l2) 
        {
            l1 = l1 -> next;
            l2 = l2 -> next;
        }
        
        if (!l1)
        {
            l1 = headB;
            while(l1 && l2)
            {
                l1 = l1 -> next;
                l2 = l2 -> next;
            }
            l2 = headA;
            while(l1 && l2 && l1 != l2)
            {
                l1 = l1 -> next;
                l2 = l2 -> next;
            }
        }
        
        else
        {
            l2 = headA;
            while(l1 && l2)
            {
                l1 = l1 -> next;
                l2 = l2 -> next;
            }
            l1 = headB;
            while(l1 && l2 && l1 != l2)
            {
                l1 = l1 -> next;
                l2 = l2 -> next;
            }
        }
        if (l1 != l2)
            return NULL;
        return l1;
    }
};
View Code

 

posted on 2014-12-20 10:24  higerzhang  阅读(409)  评论(0编辑  收藏  举报