剑指Offer - 两个链表第一个公共节点

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述

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

代码:

注意:没有检测环状链表。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
    int getLen(ListNode* p) {
        int ret = 0;
        while (p != NULL) {
            ++ret;
            p = p->next;
        }
        return ret;
    }
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        if (pHead1 == NULL || pHead2 == NULL) return NULL;
        int len1 = getLen(pHead1), len2 = getLen(pHead2);

        ListNode* p1 = pHead1;
        ListNode* p2 = pHead2;
        if (len1 < len2) {
            int tmp = len1;
            len1 = len2;
            len2 = tmp;

            ListNode* ltmp = p1;
            p1 = p2;
            p2 = ltmp;
        }

        for (int i=0; i<len1-len2; ++i) {
            p1 = p1->next;
        }

        while (p1 != NULL && p2 != NULL && p1 != p2) {
            p1 = p1->next;
            p2 = p2->next;
        }

        if (p1 == p2) return p1;
        else return NULL;
    }
};

原文地址:https://www.cnblogs.com/charlesblc/p/8445818.html

时间: 2024-09-28 11:18:22

剑指Offer - 两个链表第一个公共节点的相关文章

剑指Offer35 两个链表第一个公共结点

1 /************************************************************************* 2 > File Name: 35_FirstCommonNode.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月02日 星期五 20时52分28秒 6 *********************************

剑指offer——两个链表的公共节点

题目链接:输入两个链表,找出它们的第一个公共结点. 解题思路: 找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为2个链表用公共的尾部) 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindFir

剑指Offer对答如流系列 - 链表中环的入口节点

面试题23:链表中环的入口节点 问题描述 一个链表中包含环,如何找出环的入口结点?例如,在图中的链表中,环的入口结点是结点3. 链表的结构 public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 问题分析 首先不能忽略链表中不包含环的情况,第一件事情必须先确定链表是否有环:我们可以使用两个引用,一个跑的快.一个跑的慢,同时出发,跑的快的追上跑的慢的自然说明有环.(

【剑指Offer】删除链表中重复的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head 用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针 /* struct Li

剑指offer:删除链表中重复的节点

题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def deleteDuplicat

【剑指offer】复杂链表的复制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数.(节点编号从1开始).接下来有n个数,表示链表节点中的值.接下来有n个数Ti,Ti表示第i个节点的另

剑指Offer:删除链表的节点【18】

剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题目分析 如上图所示,我们的定义了三个指针,其中第二.三个指针用于找到重复元素的第一个位置和最后一个位置的下一个位置,然后第一个指针的下一个指向三个指针,这样就跳过了重复元素. 但是编码发现后,还有两种情况欠考虑. 这种情况,刚开始,就是

剑指OFFER之反转链表(九度OJ1518)

题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素. 输出: 对应每个测试案例,以此输出链表反转后的元素,如没有元素则输出NULL. 样例输入: 5 1 2 3 4 5 0 样例输出: 5 4 3 2 1 NULL 解题思路:

剑指offer (27) 复杂链表的复制

题目:请实现一个函数,复制一个复杂链表,在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点,还有一个m_pSibling指向链表中的任意节点或者NULL struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; }; 方法一: step1. 复制原始链表的每一个节点,并用m_pNext链接起来 step2. 设置每个结点的m_pSibling指针 由于m