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

1、蛮力法:

 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         if(pHead1==NULL||pHead2==NULL)
13             return NULL;
14         ListNode* p1;
15         ListNode* p2;
16         for(p1=pHead1;p1!=NULL;p1=p1->next){
17             for(p2=pHead2;p2!=NULL;p2=p2->next){
18                 if(p1==p2)
19                     return p1;
20             }
21         }
22         return NULL;
23     }
24 };

2、

从链表的定义可以看出,这两个链表是单链表,如果两个链表有公共节点,那么这两个链表从某一节点开始,它们的m_pNext都指向同一个节点,之后它们所有的节点都是重合的,不可能再出现分叉。所以拓扑形状看起来是Y型。

一个简单的方法是:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,先在较长的节点上走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的公共的节点。

 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         if(pHead1==NULL||pHead2==NULL)
13             return NULL;
14         int l1=0,l2=0;
15         ListNode* p1=pHead1;
16         ListNode* p2=pHead2;
17         while(p1!=NULL){
18             l1++;
19             p1=p1->next;
20         }
21         while(p2!=NULL){
22             l2++;
23             p2=p2->next;
24         }
25         int d1=0,d2=0;
26         if(l1>l2)
27             d1=l1-l2;
28         if(l1<l2)
29             d2=l2-l1;
30         p1=pHead1;
31         p2=pHead2;
32         while(d1!=0){
33             p1=p1->next;
34             d1--;
35         }
36         while(d2!=0){
37             p2=p2->next;
38             d2--;
39         }
40         while(p1!=NULL&&p2!=NULL){
41             if(p1==p2)
42                 return p1;
43             p1=p1->next;
44             p2=p2->next;
45         }
46         return NULL;
47     }
48 };
时间: 2024-11-06 07:06:15

两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。的相关文章

给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列

问题 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列.规则如下: 一次只能改变一个字母 中间单词必须在字典里存在 例如: 给出 start = "hit"end = "cog"dict = ["hot","dot","dog","lot","log"] 返回 [ ["hit","hot",&

Python List index()方法-用于从列表中找出某个值第一个匹配项的索引位置

描述 index() 函数用于从列表中找出某个值第一个匹配项的索引位置. 语法 index()方法语法: list.index(obj) 参数 obj -- 查找的对象. 返回值 该方法返回查找对象的索引位置,如果没有找到对象则抛出异常. 实例 以下实例展示了 index()函数的使用方法: #!/usr/bin/python aList = [123, 'xyz', 'zara', 'abc']; print "Index for xyz : ", aList.index( 'xyz

找出字符串中第一个不重复的字符(JavaScript实现)

如题~ 此算法仅供参考,小菜基本不懂高深的算法,只能用最朴实的思想去表达. 1 //找出字符串中第一个不重复的字符 2 // firstUniqueChar("vdctdvc"); --> t 3 function firstUniqueChar(str){ 4 var str = str || "", 5 i = 0, 6 k = "", 7 _char = "", 8 charMap = {}, 9 result =

华为OJ:找出字符串中第一个只出现一次的字符

可以稍微让代码写的好看,不用直接写双循环的话,就可以写成函数的调用,重用性也很高. import java.util.Scanner; public class findOnlyOnceChar { public static boolean FindChar(String pInputString, char pChar){ int count=0; for(int i=0;i<pInputString.length();i++){ if(pInputString.charAt(i)==pCh

找出字符串中第一个出现次数最多的字符

找出字符串中第一个出现次数最多的字符 详细描述: 接口说明 原型: bool FindChar(char* pInputString, char* pChar); 输入参数: char* pInputString:字符串 输出参数(指针指向的内存区域保证有效): char* pChar:出现次数最多的字符 返回值: false 异常失败 true  输出成功 #include <iostream> #include <string.h> using namespace std; b

找出字符串中第一个只出现一次的字母

// 一个字符串由[a-z]组成,请找出该字符串第一个只出现一次的字母: var str = "354691236549870213654789501287i45465444" var obj = {};//去重 for(var i = 0; i < str.length;i++){ var count = 1: obj[str[i]] = count: } arr = Object.keys(obj): var arr_ = []: for(i in arr){ var num

输入一串数字找出其中缺少的最小的两个数

Description There is a permutation without two numbers in it, and now you know what numbers the permutation has. Please find the two numbers it lose. Input There is a number Tshows there are T test cases below. (T<=10)  For each test case , the first

找出字符串中第一个只出现一次的字符

find the first unique character in  a string and you can just traverse this string only one time. if there is no such character, just return '#' and '#' will not appear in the string, else return the character you find. for example: "aAbBABac",

[华为]找出字符串中第一个只出现一次的字符

输入描述: 输入一个非空字符串 输出描述: 输出第一个只出现一次的字符,如果不存在输出-1 输入例子: asdfasdfo 输出例子: o 1 //用哈希统计词频 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 int hasTable[256]; 6 7 int main() 8 {     9 string s;     10 while(cin>>s) 11 {         12