【链表】两个链表的第一个公共结点

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

 1 public class Solution {
 2
 3     /**
 4      * 思路:两个链表相交,存在公共的链表尾,根据链表长度的差值,移动指针,找到第一个相同的节点,即为第一个公共节点
 5      * @param pHead1
 6      * @param pHead2
 7      * @return
 8      */
 9     public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
10
11         if (pHead1 == null || pHead2 == null) {
12             return null;
13         }
14
15         int d = 0;
16
17         ListNode p1 = pHead1;
18         ListNode p2 = pHead2;
19
20         int length1 = 0;
21         while (pHead1 != null) {
22             length1++;
23             pHead1 = pHead1.next;
24         }
25
26         int length2 = 0;
27         while (pHead2 != null) {
28             length2++;
29             pHead2 = pHead2.next;
30         }
31
32         if (length1 > length2) {
33             d = length1 - length2;
34
35             while (d > 0) {
36                 p1 = p1.next;
37                 d--;
38             }
39         } else if (length1 < length2) {
40             d = length2 - length1;
41
42             while (d > 0) {
43                 p2 = p2.next;
44                 d--;
45             }
46         } else {
47             return p1;
48         }
49
50         while (p1 != null) {
51             if (p1 == p2) {
52                 break;
53             }
54             p1 = p1.next;
55             p2 = p2.next;
56         }
57         return p1;
58     }
59 }
60
61 class ListNode {
62     int val;
63     ListNode next = null;
64
65     ListNode(int val) {
66         this.val = val;
67     }
68 }
时间: 2024-10-11 12:29:38

【链表】两个链表的第一个公共结点的相关文章

编程算法 - 两个链表的第一个公共结点 代码(C)

两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素. 时间复杂度: O(n) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #i

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

输入两个链表,找出它们的第一个公共结点. import java.util.*; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode current1 = pHead1; ListNode current2 = pHead2; HashMap<ListNode,Integer> hashMap = new HashMap<ListN

两个链表第一个公共结点

题目:输入两个链表,找出它们的第一个公共节点.链表的定义如下: struct ListNode { int m_nValue; ListNode *m_pNext; }; 思路1:采用蛮力的方法:在第一个链表上顺序遍历每个节点,每遍历到一个节点的时候,在第二个链表上顺序遍历每个节点.如果第二个链表上的节点和第一个链表上的节点一样,就说明两个链表在节点上重合,于是就找到了公共的节点.而通常蛮力并不是好的方法. 思路2:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多

两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点. 首先遍历俩个链表得到它们的长度,以及长的链表多几个结点.在第二次遍历的时候,在较长的链表先走长度之差步,接着再同时在俩个链表遍历,找到的第一个相同的结点就是她们的第一个公共结点 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: int length(

两个链表的第一个公共结点(剑指offer)+链表

两个链表的第一个公共结点 参与人数:1171时间限制:1秒空间限制:32768K 通过比例:31.25% 最佳记录:0 ms|0K(来自  running) 题目描述 输入两个链表,找出它们的第一个公共结点. 链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

两个链表的第一个公共结点-剑指Offer

两个链表的第一个公共结点 题目描述 输入两个链表,找出它们的第一个公共结点. 思路 若用暴力比较,一个个的节点比较,时间复杂度为O(n2),不可取 根据题意,两个链表若有公共节点,最终要连起来,像一个Y形,所以我们从后往前遍历,但是单向链表只能从前往后,所以这符合“先进后出”,可以用两个辅助栈 也可以不用辅助栈,我们先将两个链表遍历一遍,获取长度大小,然后从长的先开始遍历,到达相等长度后同时开始遍历,直到遍历到相等的节点 这个问题可以类比到求二叉树中两个叶结点的最低公共祖先的问题 代码 /* p

剑指offer (37) 两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点 如果两个链表有公共结点,那么公共结点一定出现在两个链表的尾部 如果两链表长度不相等,那么达到公共结点的步数就不一致,如何确保 两个链表从头开始遍历,同步达到公共结点? 这是关键所在 如果两链表长度相同,那么就可以同步达到了? 由此,我们就需要 让两个链表长度"相等" 我们假设 两链表长度分别为m和n,且m > n, 那么我们可以在较长链表中 先走 m - n 步,然后 两个链表游标同步走,如果有公共结点,那么就一定同时达到 ListN

37.两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点,链表结点定义如下: struct  ListNode {          int m_nKey;          ListNode*  m_pNext; }; ListNode* FindFirstComonNode(ListNode* pHead1, ListNode* pHead2) { //得到两个链表的长度 unsigned int nLength1 = GetListLength(pHead1); unsigned int nLengt

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

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26097395 简单题,剑指offer上的第37题,九度OJ上AC. 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数.接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开.第二行为第二个链表的所有元素,中间用空格隔开. 输出: 对应