zoukankan      html  css  js  c++  java
  • 面试题37 两个链表的第一个公共结点

    题目描述

    输入两个链表,找出它们的第一个公共结点。
     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 = pHead1, *p2 = pHead2;
    15         int l1 = 0, l2 = 0;
    16         while(p1){
    17             l1++;
    18             p1 = p1->next;
    19         }
    20         
    21         while(p2){
    22             l2++;
    23             p2 = p2->next;
    24         }
    25         
    26         int n = l1 - l2;
    27         p1 = pHead1; p2 = pHead2;
    28         if (l2 > l1){
    29             p1 = pHead2;
    30             p2 = pHead1;
    31             n = l2 - l1;
    32         }
    33         for (int i = 0; i < n; i++)
    34             p1 = p1->next;
    35         while (p1 != NULL && p2 != NULL && p1 != p2){
    36             p1 = p1->next;
    37             p2 = p2->next;
    38         }
    39         ListNode *p = p1;
    40         return p;
    41     }
    42 };
     1 class Solution {
     2 public:
     3     int Merge(vector<int> &A, int p, int q, int r)
     4     {
     5         int count = 0;
     6 
     7         vector<int> B;
     8         vector<int> C;
     9 
    10         for (int i = p; i <= q; i++)
    11         {
    12             B.push_back(A[i]);
    13         }
    14         for (int i = q + 1; i <= r; i++)
    15         {
    16             C.push_back(A[i]);
    17         }
    18 
    19         int m = B.size() - 1, n = C.size() - 1;
    20         for (int i = r; i >= p; i--)
    21         {
    22             if (m == -1 && n != -1)
    23             {
    24                 while (n != -1)
    25                 {
    26                     A[i] = C[n];
    27                     i--;
    28                     n--;
    29                 }
    30                 break;
    31             }
    32             if (m != -1 && n == -1)
    33             {
    34                 while (m != -1)
    35                 {
    36                     A[i] = B[m];
    37                     i--;
    38                     m--;
    39                 }
    40                 break;
    41             }
    42             if (B[m] <= C[n])
    43             {
    44                 A[i] = C[n];
    45                 n--;
    46             }
    47             else
    48             {
    49                 count += n + 1;
    50                 A[i] = B[m];
    51                 m--;
    52             }
    53         }
    54         return count;
    55     }
    56 
    57     int MergeSort(vector<int> &A, int p, int r)
    58     {
    59         if (p == r)
    60             return 0;
    61         int q = (p + r) / 2;
    62         int left = MergeSort(A, p, q);
    63         int right = MergeSort(A, q + 1, r);
    64         return left + right + Merge(A, p, q, r);
    65     }
    66 
    67     int InversePairs(vector<int> &data) {
    68         if (data.size() == 0)
    69             return 0;
    70         return MergeSort(data, 0, data.size() - 1);
    71     }
    72 };
  • 相关阅读:
    Golang手动分页,按等份拆分数据
    GORM无法映射到结构体上
    VSCODE GOLANG运行多个服务
    解决,MAVEN
    Properties配置文件常见错误写法以及转义字符说明
    Pentaho Data Integration (PDI/Kettle)与Java版本支持关系
    MYSQL之读写分离搭建方案
    Windows下创建软件快速启动命令
    Sonar的一些使用总结
    使用SVG Path绘图
  • 原文地址:https://www.cnblogs.com/wanderingzj/p/5358700.html
Copyright © 2011-2022 走看看