两个链表的公共结点

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

链表结点定义如下:


1 struct ListNode
2 {
3 int m_nValue;
4 ListNode* m_pNext;
5 }

思想:我们可以先遍历一次得到分别得到两个链表的长度,然后计算得出长度差n,那么让较长的链表先走n步,然后两个链表一起向后走,直到两个指针指向同一个结点。这个结点就是我们要找的
结点。具体代码如下:


 1 int GetListLength(ListNode* pHead)
2 {
3 int length = 0 ;
4 while (pHead != NULL)
5 {
6 length++ ;
7 pHead = pHead->m_pNext ;
8 }
9 return length ;
10 }
11
12 ListNode* FindFirstCommonNode(ListNode* pHead1 , ListNode* pHead2)
13 {
14 int nLength1 = GetListLength(pHead1) ;
15 int nLength2 = GetListLength(pHead2) ;
16 int LengthDiff = nLength1 - nLength2 ;
17
18 ListNode* pLongListHead = pHead1;
19 ListNode* pShortListHead = pHead2 ;
20 if (LengthDiff < 0)
21 {
22 LengthDiff = - LengthDiff ;
23 pLongListHead = pHead2;
24 pShortListHead = pHead1 ;
25 }
26 for (int i = 0 ; i < LengthDiff ; i++)
27 {
28 pLongListHead = pLongListHead->m_pNext;
29 }
30
31 while (pLongListHead != NULL && pShortListHead != NULL && pLongListHead != pShortListHead)
32 {
33 pLongListHead = pLongListHead->m_pNext;
34 pShortListHead = pShortListHead->m_pNext;
35 }
36
37 ListNode* pFirstCommonNode = pLongListHead ;
38 return pFirstCommonNode;
39 }

时间: 2024-11-08 11:10:02

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

牛客 寻找两个链表的公共结点

class Solution {public:    ListNode* FindFirstCommonNode( ListNode* pHead1,ListNode* pHead2) {         ListNode* p1=pHead1;         ListNode* p2=pHead2;        while(p1!=p2)            {              p1=(p1==NULL?pHead2:p1->next);              p2=(p2

链表:判断链表是否带环 、求两个链表的相交结点

问题一:返回两个链表的相交结点1.先分别得到两个链表的长度2.得到长度差,3.先让长链表的头结点走(长度差)步.4.这时.短链表头结点还在原地,两者开始一起走,当得到两者val相等时,这个结点就是公共结点,即相遇结点. 问题二:判断链表是否带环1.定义两个快慢指针,快指针先走两步,慢指针再走一步.直到快慢指针当前结点相同. 如果快指针先为null,则表示没有环,返回null.2.如果带环,让起点和相遇点同时出发.同走一步,再判断相等与否,如果相等退出循坏 返回这个结点 ```public cla

[算法]打印两个链表的公共部分

题目: 给定两个有序链表的头指针head1和head2,打印两个链表的公共部分. 解答: 因为是有序列表,所以从两个链表的头开始进行如下判断: 如果head1的值小于head2,那么head1向下移动. 如果head1的值大于head2,那么head2向下移动. 如果二者的值相等,则打印这个值,然后head1和head2都向下移动. head1和head2有任何一个移动到null,整个过程停止. 程序: public static class Node { public int value; p

剑指offer系列62---两个链表的公共结点

[题目]输入两个链表,找出它们的第一个公共结点. * [思路]1 获取两链表的长度: * 2 让长的链表先走n步后此时走到短链表起始位置: * 3 两链表同时遍历,直至相同,这时返回第一个公共结点. 1 package com.exe11.offer; 2 3 /** 4 * [题目]输入两个链表,找出它们的第一个公共结点. 5 * [思路]1 获取两链表的长度: 6 * 2 让长的链表先走n步后此时走到短链表起始位置: 7 * 3 两链表同时遍历,直至相同,这时返回第一个公共结点. 8 * @

剑指offer——两个链表的公共节点

题目链接:输入两个链表,找出它们的第一个公共结点. 解题思路: 找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为2个链表用公共的尾部) 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindFir

C++算法之 找出两个链表的公共节点

题目:输入两个链表,找出它们第一个公共节点.链表节点定义如下: struct ListNode { int    m_nKey; ListNode*   m_pNext; } 方法1:在第一个链表上顺序遍历每一个节点,没遍历一个节点,在第二个链表上顺序遍历每个节点.  O(n^2) 方法2:找到两个链表的长度差,先遍历长链表到短链表的长度处,然后两个链表同时遍历,没遍历依次比较两个节点指针是否相同, 注意是比较节点指针,不是节点的值! 代码: // FindFirstCommandNode.cp

链表 | 将递增有序的两个链表的公共元素合并为新的链表

王道P38T14 主代码: LinkList common_subList(LinkList &A,LinkList &B){ LNode *C=new LNode,*pC=C; C->next=NULL; LNode* pA=A->next,*pB=B->next; while(pA!=NULL && pB!=NULL){ if(pA->data < pB->data){ pA=pA->next; }else if(pA->

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

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