【剑指offer】面试题52:两个链表的第一个公共节点

来源:互联网 发布:打口鞋淘宝匡威能买吗 编辑:程序博客网 时间:2024/06/05 20:57

题目

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

思路

关键:
这题的关键点在于,这两个链表,如果有公共点,
那么从他们的公共点开始,到链表结束,在两个链表中是一致的。

解法1:
使用两个栈

解法2:
1.首先遍历两个链表得到它们的长度m, n (m > n)
2.在长度为m的链表上先走m-n步
3.同时在两个链表上遍历,第一个相同的节点就是他们的第一个公共节点

代码(解法2)

/** * 题目: * 输入两个链表,找出它们的第一个公共结点。 *  * 关键: * 这题的关键点在于,这两个链表,如果有公共点, * 那么从他们的公共点开始,到链表结束,在两个链表中是一致的。 *  * 解法1: * 使用两个栈 *  * 解法2: * 1.首先遍历两个链表得到它们的长度m, n (m > n) * 2.在长度为m的链表上先走m-n步 * 3.同时在两个链表上遍历,第一个相同的节点就是他们的第一个公共节点 *  * @author peige */public class _52_FirstCommonNodesInLists {    public static class ListNode {        public int val;        public ListNode next = null;        ListNode(int val) {            this.val = val;        }    }    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {        if(pHead1 == null || pHead2 == null)            return null;        int len1 = 0;        int len2 = 0;        ListNode cur1 = pHead1;        ListNode cur2 = pHead2;        // 求链表1、链表2长度        for(ListNode cur = pHead1; cur != null; cur = cur.next)            ++len1;        for(ListNode cur = pHead2; cur != null; cur = cur.next)            ++len2;        if(len1 > len2) {            for(int i = 0; i < len1 - len2; ++i)                cur1 = cur1.next;        }        else {            for(int i = 0; i < len2 - len1; ++i)                cur2 = cur2.next;        }        while(cur1 != null) {            if(cur1 == cur2)                return cur1;            cur1 = cur1.next;            cur2 = cur2.next;        }        return null;    }}

测试

/** * 太简单了就不测试了 0.0 *  * @author peige */public class _52_Test {}
阅读全文
0 0
原创粉丝点击