剑指offer——两个链表的第一个公共结点

来源:互联网 发布:java 读取表单文件 编辑:程序博客网 时间:2024/06/05 09:42

题目描述:

输入两个链表,找出它们的第一个公共结点。


思路:

由于是单链表,所以可以发现从第一个公共节点开始,后面的结点都是相同的,一种思路是从两个链表的尾部开始遍历,直到发现最后一个相同的结点为止,那么这最后一个相同的结点是单链表的角度看就是两个链表的第一个公共节点了。还有一种思路是不需要从尾部开始遍历,毕竟从尾部遍历单链表的话还得使用反转链表的方法进行操作,首先计算出两个链表的长度,让更长的那个单链表先移动两个链表长度差值个位置,然后两个链表同时移动,从更短的那个链表的第一个位置开始遍历,两个链表都往后移动,当发现第一个相同的结点的值的时候,那么该节点就是第一个公共节点了。


算法实现:

/*public class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}*/public class Solution {    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {         //首先计算两个链表的长度        int listLen1 = 0;        int listLen2 = 0;        ListNode temp = pHead1;        while(temp!=null){            listLen1++;            temp = temp.next;        }        temp = pHead2;        while(temp!=null){            listLen2++;            temp = temp.next;        }        ListNode longList = null;        ListNode shortList = null;        int k = 0;  //长链表与短链表的差值        if((listLen1-listLen2)>=0){            longList = pHead1;            shortList = pHead2;            k = listLen1-listLen2;        }else{            longList = pHead2;            shortList = pHead1;            k = listLen2-listLen1;        }        for(int i=0;i<k;i++){            longList = longList.next;        }        while(shortList!=null&&(shortList.val!=longList.val)){            shortList = shortList.next;            longList = longList.next;        }        return shortList;           }}
1 0