10.两个链表的交叉

题目:请写一个程序,找到两个单链表最开始的交叉节点。

注意事项
  • 如果两个链表没有交叉,返回null
  • 在返回结果后,两个链表仍须保持原有的结构。
  • 可假定整个链表结构中没有循环。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    /**
     * @param headA: the first list
     * @param headB: the second list
     * @return: a ListNode
     */
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // write your code here
       stack<ListNode *> stackA, stackB;
        ListNode * result = NULL, *pA = headA, *pB = headB;
        if (headA == NULL || headB == NULL)
            return result;
        while (pA != NULL) {
            stackA.push(pA);
            pA = pA->next;
        }
        while (pB != NULL) {
            stackB.push(pB);
            pB = pB->next;
        }

while (!stackA.empty() && !stackB.empty()) {
            if (stackA.top() == stackB.top()) {
                result = stackA.top();
                stackA.pop();
                stackB.pop();
            } else {
                break;
            }
        }
        return result;
    }
};

时间: 2024-11-05 15:58:56

10.两个链表的交叉的相关文章

lintcode 中等题:Intersection of Two Linked Lists 两个链表的交叉

题目 两个链表的交叉 请写一个程序,找到两个单链表最开始的交叉节点. 样例 下列两个链表: A: a1 → a2 c1 → c2 → c3 B: b1 → b2 → b3 在节点 c1 开始交叉. 注意 如果两个链表没有交叉,返回null. 在返回结果后,两个链表仍须保持原有的结构. 可假定整个链表结构中没有循环. 挑战 需满足 O(n) 时间复杂度,且仅用 O(1) 内存. 解题 尝试用时间复杂度是O(NM),却没有解决,在这个博客看到根据两个链表的特性进行解决. 就如同上图,两个链表相交的部

查找两个链表的交叉节点

1. 问题描述 给定两个单链表,查找这两个单链表的交叉节点.例如:链表listA为:a1→a2→c1→c2→c3,链表listB为:b1→b2→b3→c1→c2→c3.那么这两个的第一个交叉节点为c1. 2. 方法与思路 首先,观察一下交叉节点的特点.如果两个链表有交叉节点的话,那么这个交叉节点之后的其他节点都是相同的,也就是说两个链表的结构应该是Y字型的. 也就是说,c1之后的节点都是交叉节点.下面的问题就是如何确定c1这个节点,我们可以设两个指针分别遍历两个链表,然后对比节点的值,但是两个链

两个链表的交叉

代码(C++): /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: /** * @param headA: the first list * @param headB: the second list * @return:

10.两个单链表相交,计算相交点

10.两个单链表相交,计算相交点 思路1: 分别遍历两个单链表,计算出它们的长度M和N,假设M比N大,则长度M的链表先前进M-N,然后两个链表同时以步长1前进,前进的同时比较当前的元素,如果相同,则必是交点.Node* getIntersectPoint(Node* Head1,Node* Head2) //两链表相交,计算相交点 Node* getIntersectPoint(Node* Head1,Node* Head2) {   int len1=numOfNodes(Head1);  

哈希(4) - 求两个链表的交集(intersection)以及并集(union)

给定两个链表,求它们的交集以及并集.用于输出的list中的元素顺序可不予考虑. 例子: 输入下面两个链表: list1: 10->15->4->20 list2: 8->4->2->10 输出链表: 交集list: 4->10 并集list: 2->8->20->4->15->10 方法1 (简单方法) 可以参考链表系列中的"链表操作 - 求两个链表的交集(intersection)以及并集(union)" 方法2

两个链表第一个公共结点

题目:输入两个链表,找出它们的第一个公共节点.链表的定义如下: struct ListNode { int m_nValue; ListNode *m_pNext; }; 思路1:采用蛮力的方法:在第一个链表上顺序遍历每个节点,每遍历到一个节点的时候,在第二个链表上顺序遍历每个节点.如果第二个链表上的节点和第一个链表上的节点一样,就说明两个链表在节点上重合,于是就找到了公共的节点.而通常蛮力并不是好的方法. 思路2:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多

LeetCode OJ: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. 找出第一个合并的节点的位置(或者说插入),注意复杂度为O(N),那么先遍历两个链

合并两个链表的问题

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #define N 10 typedef struct Node { int data; struct Node *next; }Node, *pNode; /*顺序插入法*/ void create_list_sequence(pNode *h) { pNode p, q, r=NULL; p = q =

【链表】两个链表的第一个公共结点

输入两个链表,找出它们的第一个公共结点. 1 public class Solution { 2 3 /** 4 * 思路:两个链表相交,存在公共的链表尾,根据链表长度的差值,移动指针,找到第一个相同的节点,即为第一个公共节点 5 * @param pHead1 6 * @param pHead2 7 * @return 8 */ 9 public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { 10 11 if