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

题目描述

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

思路1:

首次遍历:算出2个链表的长度l1,l2。

第二次遍历,长的链表先走|l2-l1|步,然后2个链表同时遍历,找到第一个相同的节点输出。

 1 public class Solution {
 2     public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
 3          int l1 = 0,l2 = 0,ldiff=0;
 4         ListNode longp,shortp;
 5
 6         // 得到长度
 7         for(ListNode p = pHead1;p!=null;p=p.next)
 8             l1++;
 9         for(ListNode p = pHead2;p!=null;p=p.next)
10             l2++;
11         if(l1>l2){
12             ldiff = l1-l2;
13             longp=pHead1;shortp = pHead2;
14         }
15            else{
16              ldiff = l2-l1;
17             longp=pHead2;shortp = pHead1;
18         }
19         //长链表先走
20         for(int i = 0;i<ldiff;i++){
21             longp = longp.next;
22         }
23         //2个链表同时遍历
24         while(longp!=null){
25             if(longp.val==shortp.val) return longp;
26             longp = longp.next;
27             shortp = shortp.next;
28
29         }
30         return null;
31     }
32 }

原文地址:https://www.cnblogs.com/zle1992/p/8167741.html

时间: 2024-07-30 17:04:29

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

剑指offer系列——36.两个链表的第一个公共结点

Q:输入两个链表,找出它们的第一个公共结点.(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) T:这个题的意思是两个链表要么有公共结点,要么没有公共结点,不存在相交的情况. A: 1.传统做法:长的先走,直到和短的相同长度,然后两个一起走,直至相等. ListNode *FindFirstCommonNode(ListNode *pHead1, ListNode *pHead2) { if (pHead1 == nullptr || pHead2 ==

两个链表的第一个公共结点(剑指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

编程算法 - 两个链表的第一个公共结点 代码(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

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

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

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

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

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

36.两个链表的第一个公共节点。

题目描述: ??输入两个链表,找出它们的第一个公共结点. 思路分析: ??由于链表的指针只能指向一个节点,所以两个链表相交后,后面的部分完全一样.所以我们的解题思路就是先求出两个链表的长度,设置俩个指针分别指向两个链表的头部.指向较长链表的指针先走两个链表长度差步,然后两个指针同时开始走,当两个指针指向同一个节点时,这个节点就是第一个公共节点. 代码: /* public class ListNode { int val; ListNode next = null; ListNode(int v

剑指offer 36.时间空间效率的平衡 两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点. 解题思路 如果存在共同节点的话,那么从该节点,两个链表之后的元素都是相同的. 也就是说两个链表从尾部往前到某个点,节点都是一样的. 我们可以用两个栈分别来装这两条链表.一个一个比较出来的值. 找到第一个相同的节点. 代码如下 public class FindFirstCommonNode { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if (

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

输入两个链表,找出它们的第一个公共结点. 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