zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    JS高级拖拽
    JS高级Date类
    JS高级闭包
    JS笔记整理
    JS高级解决函数内的this指向
    JS高级事件委托
    JS高级 事件对象
    JS中级面向对象
    JS中级
    JS高级
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4175112.html
Copyright © 2011-2022 走看看