zoukankan      html  css  js  c++  java
  • 两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。

    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 };
  • 相关阅读:
    Android 中常用代码片段
    查看oracle中的中文所占字节数
    order by 中 使用decode
    Oracle select 中case 的使用以及使用decode替换case
    pyqt5 'QWidget' object has no attribute 'setCentralWidget'(转)
    程序员之路:python3+PyQt5+pycharm桌面GUI开发(转)
    QT5入门之23 -QT串口编程(转)
    xpath-helper: 谷歌浏览器安装xpath helper 插件
    mysql给root开启远程访问权限
    Vmware无法获取快照信息 锁定文件失败
  • 原文地址:https://www.cnblogs.com/zl1991/p/4775888.html
Copyright © 2011-2022 走看看