找出两个链表的交叉点

来源:互联网 发布:mac 任务管理工具 编辑:程序博客网 时间:2024/06/05 01:00

请写一个程序,找到两个单链表最开始的交叉节点。
注意事项
如果两个链表没有交叉,返回null。
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。

样例
下列两个链表:
A: a1 → a2
     ↘
       c1 → c2 → c3
       ↗
B: b1 → b2 → b3
在节点 c1 开始交叉。

  最高效最优的方法就是从尾结点开始往前找交叉点,对于单链表来说这种方法是无法实现的.

有两种可行的方案
1.暴力搜索,直接比对所有结点,直到找出交叉点
2.将两个链表尾对齐,然后从较短的那条链开始寻找交叉点,可以做到的是找交叉点的时间复杂度为o(n),但是需要花额外的时间去求链表的长度

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null;       *     } * } */public class Solution {    /**     * @param headA: the first list     * @param headB: the second list     * @return: a ListNode      */    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        // Write your code here        ListNode p1 = headA;        ListNode p2 = headB;        if(p1 == null || p2 == null)            return null;        int len1 = 0;                       //A链长度        while(p1.next != null)        {            p1 = p1.next;            len1 ++;        }        int len2 = 0;        while(p2.next != null)              //B链长度        {            p2 = p2.next;            len2 ++;        }        if(p1 != p2)                        //相交则最后一点必然相同            return null;        int le = Math.abs(len1 - len2);     //长度差        if(len1 > len2)        {            p1 = headA;            p2 = headB;        }        else        {            p1 = headB;            p2 = headA;        }        for(int i=0; i < le; i++)           //调整起点,使两条链对齐          {              p1 = p1.next;          }          while(p1 != p2)                     //查找交叉点          {              p1 = p1.next;              p2 = p2.next;          }          return p1;          // //暴力算法        // boolean intersec = false;        // while(p1 != null)        // {        //     while(p2 != null)        //     {        //         if(p1 == p2)        //         {        //             intersec = true;        //             break;        //         }        //         p2 = p2.next;        //     }        //     if(intersec)        //         break;        //     p1 = p1.next;        //     p2 = headB;        // }        // return p2;    }  }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 建行登录密码忘了怎么办 新捷达epc灯亮怎么办 捷达车玻璃升降偏离怎么办 交金中断一个月怎么办 博士拟录取没导师怎么办 保研联系导师后怎么办 特别害怕和导师交流怎么办 面试工资要少了怎么办 一面工资要低了怎么办 家乐卡到期本金还一半怎么办 新三板公司没有资不抵债没钱怎么办 户户通智能卡坏了怎么办 秦岭云无法回看怎么办 身份证在火车站丢了怎么办 到火车站发现身份证丢了怎么办 广电宽带太慢了怎么办 车有后雷达想装前置雷达怎么办 现代朗动油耗大怎么办 雷达线雕头里有水怎么办 上古卷轴5免疫死亡奴役怎么办 dw手表时针不动了怎么办 雷达陶瓷表壳摔坏了怎么办 雷达表盘摔坏了怎么办 雷达测速60超了怎么办 卡西欧手表电池没电了怎么办 审稿人让引用他的文章怎么办 考二建未从事该行业满两年怎么办 2档换3档离合器怎么办 高铁车票丢了怎么办 事业编制调动原单位不同意怎么办 想去铁路上工作怎么办 房产权50年以后怎么办 在香港手机没电怎么办 学校官网登陆忘记密码怎么办 网上申报学校忘记密码怎么办 专转本想换专业怎么办 发生工伤没有平均公资怎么办? 单招过了不想去怎么办 22岁了还想复读怎么办 父母不让我读大专了怎么办 专升本考试失利怎么办