36、剑指offer--两链表的第一个公共结点

题目描述

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

解题思路:本题先分别遍历两个链表一遍,求出两个链表的长度。并求出长度差值。然后让长度长的链表先走差值步,然后两个链表一起移动,直到两链表重合,返回第一个结点。

注意:判断条件while((pLong != NULL) && (pShort != NULL) && (pLong->val != pShort->val))

以上为正确的判断条件,while((pLong != NULL) && (pShort != NULL) && (pLong!= pShort)这样写在牛客网上能通过,但是在本地编译器,这样判断,只有当两个链表有一个为空时才会跳出循环,不是两链表重合就跳出循环。重合时pLong也不等于pShort

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10 public:
11     ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
12         unsigned int length1 = GetListLength(pHead1);
13         unsigned int length2 = GetListLength(pHead2);
14
15         int nLength = 0;
16         ListNode *pLong;
17         ListNode *pShort;
18         if(length1 > length2)
19         {
20             nLength = length1 - length2;
21             pLong = pHead1;
22             pShort = pHead2;
23         }
24         else
25         {
26             nLength = length2 - length1;
27             pLong = pHead2;
28             pShort = pHead1;
29         }
30
31         for(int i=0;i<nLength;i++)
32         {
33             pLong = pLong->next;
34         }
35         //两链表已对齐
36         while((pLong != NULL) && (pShort != NULL) && (pLong->val != pShort->val))
37         {
38             pLong = pLong->next;
39             pShort = pShort->next;
40         }
41         ListNode *pFirstCommmonNode = pLong;
42         return pFirstCommmonNode;
43
44     }
45     unsigned int GetListLength(ListNode *pHead)
46     {
47         unsigned int length = 0;
48         ListNode *pNode = pHead;
49         while(pNode != NULL)
50         {
51             length++;
52             pNode = pNode->next;
53         }
54         return length;
55     }
56 };
时间: 2024-10-11 00:52:04

36、剑指offer--两链表的第一个公共结点的相关文章

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

链接 牛客OJ:两个链表的第一个公共结点 九度OJ:http://ac.jobdu.com/problem.php?pid=1505 GitHub代码: 037-两个链表的第一个公共结点 CSDN题解:剑指Offer–037-两个链表的第一个公共结点 牛客OJ 九度OJ CSDN题解 GitHub代码 037-两个链表的第一个公共结点 1505-两个链表的第一个公共结点 剑指Offer–037-两个链表的第一个公共结点 037-两个链表的第一个公共结点 题意 题目描述 输入两个链表,找出它们的第

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

/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: int Getlength(ListNode* pNode) { int length = 0; ListNode* A = pNode; while (A != NULL) { ++length; A = A->next; } return leng

剑指offer (15) 链表倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k个结点 (注意:我们将链表最末一个结点记为 倒数第1个结点,也就是k从1开始计数) 解题分析: 方法一:遍历链表两次,第一次统计链表结点个数,第二次遍历就可以找到倒数第K个结点 方法二:遍历链表一次 我们使用两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针一直指向链表开头并保持不动 从第k步开始,两个指针同时向前走,这时 两个指针之间的距离一直是k-1 当第一个指针到达链表尾结点时,第二个指针指向链表倒数第k个结点 1 ListNod

剑指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):代表将要输入的两个链表的元素的个数.接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开.第二行为第二个链表的所有元素,中间用空格隔开. 输出: 对应

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

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC. 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的

剑指offer之链表

//剑指offer 之 链表 //面试题6 从尾到头打印链表 /***************************************************************************************** 问题描述: 输入一个链表的头节点,从尾到头反过来打印出每个节点的值 链表节点定义如下: struct ListNode{ int m_nValue; ListNode* m_pNext; }; *******************************

剑指offer (5) 链表插入删除

我们在操作链表的时候,必须注意以下事项: 1. 链表指针为NULL的情况 2. 插入删除涉及到 链表第一个节点时,需要修改 链表的第一个节点: a. 因为 c语言都是传值的,如果需要修改一个变量,就必须通过 指向该变量的指针(即该变量的地址) 例如:例如 修改 int a,则输入参数必须是 int* a, 修改a 则是: *a = b; (b为int) 我们需要修改一个指针时,就必须通过 该指针的地址,也就是 指向该指针的指针,即二级指针 例如  修改 int* a, 则输入参数必须是 int*