美文网首页
剑指 Offer 52. 两个链表的第一个公共节点

剑指 Offer 52. 两个链表的第一个公共节点

作者: bangbang2 | 来源:发表于2020-07-09 09:53 被阅读0次
    image.png

    解题思路

    思路其实很简单呀!!!!
    1:看两个链表相差几个node
    2:长的链表,先走几个node
    3:一个while循环,循环条件:节点不相同。两个链表同时走
    想明白了,其实不难

    代码

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) {
     *         val = x;
     *         next = null;
     *     }
     * }
     */
    public class Solution {
        public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            if(headA==null||headB==null) return null;
            ListNode h1=headA;
            int lengthA=1;
            int lengthB=1;
            ListNode h2=headB;
            while(h1!=null){//来计算链表A的长度
                 lengthA++;
                 h1=h1.next;
            }
            while(h2!=null){//计算链表B的长度
                 lengthB++;
                 h2=h2.next;
            }
            ListNode tempA=headA;//临时节点,在后边不断移动,供比较时参考
            ListNode tempB=headB;
            int a=Math.abs(lengthA-lengthB);//得到两个链表的长度差
            if(lengthB>=lengthA){//如果链表B更长,则移动链表B比A多出来的部分
                for(int i=0;i<a;i++){
                     tempB=tempB.next;
                }
            }
            while(lengthB>=lengthA&&tempB!=tempA){//移动二者的公共部分,判断条件为两个比较节点不能相等
                tempA=tempA.next;
                tempB=tempB.next;
            }
            if(lengthB<lengthA){
                for(int i=0;i<a;i++){
                     tempA=tempA.next;
                }
            }
            while(lengthB<lengthA&&tempB!=tempA){
                tempA=tempA.next;
                tempB=tempB.next;
            }
            return tempB;//一旦上述的循环结束,tempA和tempB一致返回的都是第一个公共节点
        }
    }
    

    相关文章

      网友评论

          本文标题:剑指 Offer 52. 两个链表的第一个公共节点

          本文链接:https://www.haomeiwen.com/subject/qbkjcktx.html