剑指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 FindFirstCommonNode(ListNode phead1, ListNode phead2) {
12
13         int head1_length = getlength(phead1);
14         int head2_length = getlength(phead2);
15
16         if(head1_length>=head2_length)
17         {
18             int chazhi = head1_length-head2_length;
19             for(int i=0;i<chazhi;i++)
20             {
21                 phead1 = phead1.next;
22             }
23
24         }
25         else if(head1_length<head2_length)
26         {
27             int chazhi = head2_length-head1_length;
28             for(int i=0;i<chazhi;i++)
29             {
30                 phead2 = phead2.next;
31             }
32
33         }
34         while(phead1!=phead2)
35         {
36             phead1 = phead1.next;
37             phead2 = phead2.next;
38         }
39
40         return phead1;
41
42
43     }
44
45     public static int getlength(ListNode l1)
46     {
47         int length=0;
48
49         while(l1!=null)
50         {
51             length++;
52             l1=l1.next;
53         }
54         return length;
55     }
56 }

原文地址:https://www.cnblogs.com/wangyufeiaichiyu/p/10872679.html

时间: 2024-10-09 08:39:25

剑指offer——两个链表的公共节点的相关文章

剑指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

【剑指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

【Java】 剑指offer(35) 复杂链表的复制

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指向下一个点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr. 思路 思路1:先复制结点,用next链接,最后根据原始结点的sibling指针确定该sibling结点距离头结点的位

剑指offer--44.两个链表的第一个公共结点

@selfboot 牛逼的代码,长度相同,一遍出结果, 长度不同,短的点跑完,变成长的,当长的跑完变成短的链表的时候,较长的链表已经走过了多的结点. ------------------------------------------------------------------------------------------------------------------------ 时间限制:1秒 空间限制:32768K 热度指数:185905 本题知识点: 链表 题目描述 输入两个链表,

剑指Offer-35.两个链表的第一个公共结点(C++/Java)

题目: 输入两个链表,找出它们的第一个公共结点. 分析: 先统计两个链表的长度,计算他们的差值,然后将两个链表对齐,再去寻找公共节点即可. 程序: C++ class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { int d1 = 0; int d2 = 0; int d = 0; ListNode* p1 = pHead1; ListNode* p2 = pHead

【剑指Offer】【链表】合并两个排序的链表

题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. A:若链表1为空,则合并后的链表头结点为pHead2:若链表2为空,则合并后的链表头结点为pHead1   创建ret_Head作为合并链表的新头结点,比较pHead1和pHead2,ret_Head指向小的数,ret_Head->next指向两个链表中下一个最小的数 ====> 递归 A:同样的,递归也是一种栈结构,所以也可以用栈来解决这个问题 /* struct ListNode { int