zoukankan      html  css  js  c++  java
  • [LeetCode160]Intersection of Two Linked Lists

    题目:

    Write a program to find the node at which the intersection of two singly linked lists begins.

     

    For example, the following two linked lists:

    A:          a1 → a2
                       ↘
                         c1 → c2 → c3
                       ↗            
    B:     b1 → b2 → b3
    

    begin to intersect at node c1.

     

    Notes:

      • If the two linked lists have no intersection at all, return null.
      • The linked lists must retain their original structure after the function returns.
      • You may assume there are no cycles anywhere in the entire linked structure.
      • Your code should preferably run in O(n) time and use only O(1) memory.

    思路:求一个单链表交集的首结点

      方法一:找出两个链表的长度差n,长链表先走n步,然后同时移动,判断有没有相同结点

      方法二:两个链表同时移动,链表到尾部后,跳到链表头部,相遇点即为所求

    代码:

    方法一:

     1 /**
     2 * Definition for singly-linked list.
     3 * struct ListNode {
     4 *     int val;
     5 *     ListNode *next;
     6 *     ListNode(int x) : val(x), next(NULL) {}
     7 * };
     8 */
     9 class Solution {
    10 public:
    11     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    12         //方法一
    13         ListNode *p = headA; 
    14         ListNode *q = headB;
    15         if(!p || !q) return NULL;
    16         while(p && q && p != q)
    17         {
    18         p = p->next;
    19         q = q->next;
    20         if(p == q)
    21         return p;
    22         if(!p)
    23         p = headB;
    24         if(!q)
    25         q = headA;
    26         }
    27         return p;
    28     }
    29 };

    方法二:

     1 /**
     2 * Definition for singly-linked list.
     3 * struct ListNode {
     4 *     int val;
     5 *     ListNode *next;
     6 *     ListNode(int x) : val(x), next(NULL) {}
     7 * };
     8 */
     9 class Solution {
    10 public:
    11     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    12         //方法二
    13         if (headA == NULL || headB == NULL) return NULL;
    14         ListNode *p = headA;
    15         ListNode *q = headB;
    16         int countA = 1, countB = 1;
    17         while (p->next)
    18         {
    19             p = p->next;
    20             ++countA;
    21         }
    22         while (q->next)
    23         {
    24             q = q->next;
    25             ++countB;
    26         }
    27         if (p != q) return NULL;
    28         if (countA > countB)
    29         {
    30             for (int i = 0; i < countA - countB; ++i)
    31                 headA = headA->next;
    32         }
    33         else if (countB > countA)
    34         {
    35             for (int i = 0; i < countB - countA; ++i)
    36                 headB = headB->next;
    37         }
    38         while (headA != headB)
    39         {
    40             headA = headA->next;
    41             headB = headB->next;
    42         }
    43         return headA;
    44 
    45     }
    46 };
  • 相关阅读:
    matplotlib实例笔记
    matplotlib笔记3
    pandas之时间重采样笔记
    pandas之时间序列笔记
    pandas之数据IO笔记
    pandas之聚合运算
    pandas之分组计算笔记
    算术运算符合
    数据类型 概况 (字符串,列表)
    for 循环
  • 原文地址:https://www.cnblogs.com/zhangbaochong/p/5186026.html
Copyright © 2011-2022 走看看