49.Intersection of Two Linked Lists

2024-05-12 01:18
文章标签 lists linked two 49 intersection

本文主要是介绍49.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.

Credits:
Special thanks to @stellari for adding this problem and creating all test cases.

分析:题目要求是找到两个单链表最初始的共同节点。

方法一

Step1:统计A和B的长度;

Step2:比较链表A和B的长度,为保证后面的代码统一,如果A的长度比B大,则交换A和B的头结点;

Step3:先让长的B先走|lena-lenb|步;

Step4:让A和B同时走,直到A和B为null,或者遇到A和B相同的节点。

/*找两个单链表的交叉点*/public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//时间复杂度是o(lena+lenb)ListNode A = headA;ListNode B = headB;int lena = 0;int lenb = 0;/*Step1:统计A和B的长度*/while(A!=null){lena++;A=A.next;}A = headA;while(B!=null){lenb++;B=B.next;}B = headB;/*Step2:比较链表A和B的长度,为保证后面的代码统一,如果A的长度比B大,则交换A和B的头结点*/if(lena>lenb){ListNode l = A;A = B;B = l;}/*Step3:先让长的B先走|lena-lenb|步*/for(int i=0;i<Math.abs(lena-lenb);i++){B=B.next;}/*Step4:让A和B同时走,直到A和B为null,或者遇到A和B相同的节点*/while(A!=B){A=A.next;B=B.next;}return B;}

方法二:理论上和我自己测试的都是正确的,但是在leetcode上提交之后却不通过。。。。。。。。。。。。。需要进一步考虑~~~~

 Step1:两个链表同时向后走,找到最先走到链表末尾的节点;

Step2:让最先走到末尾的链表节点指向另外一个链表的头结点,然后判断新的长链表中是否有环,如果有环则返回入口节点,否则返回null。

public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {//自己测试通过,但是leetcode提交不通过(暂时还不知道为什么????20151027)ListNode A = headA;ListNode B = headB;ListNode C = new ListNode(0);if(A==null || B==null){return null;}/*Step1:两个链表同时向后走,找到最先走到链表末尾的节点*/while(A.next!=null && B.next!=null){A=A.next;B=B.next;}/*Step2:让最先走到末尾的链表节点指向另外一个链表的头结点,然后判断新的长链表中是否有环,并返回入口节点*/if(A.next == null){A.next = headB;C = detectCycle(headA);}else{B.next = headA;C = detectCycle(headB);}return C;}/*如果一个链表中由环,则返回的是环的入口节点*/public ListNode detectCycle(ListNode head) {/*Step1:先找到链表中是否有环,有环的话通过快指针和慢指针找到其碰撞的节点*/if(head == null || head.next == null){return null;}ListNode slow = head;ListNode fast = head.next;while(fast!=null && fast.next!=null){if(fast == slow){break;}fast = fast.next.next;//每次fast走两步,slow走一步,如果有环,则fast和slow一定相遇slow = slow.next;}if(fast != slow){//fast不等于slow,说明没有环return null;}else{/*Step2:找入口节点:头结点到入口节点的距离等于碰撞点的下一个节点p到入口点的距离+(n-1)c,其中c表中环的长度*/ListNode p = fast.next;//设置p为碰撞点的下一个节点ListNode h = head;while(h!=null && p!=null){if(p == h){break;}h=h.next;p = p.next;}return h; }}





这篇关于49.Intersection of Two Linked Lists的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981190

相关文章

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

49个权威的网上学习资源网站

艺术与音乐 Dave Conservatoire — 一个完全免费的音乐学习网站,口号是“让每一个人都可以接受世界级的音乐教育”,有视频,有练习。 Drawspace — 如果你想学习绘画,或者提高自己的绘画技能,就来Drawspace吧。 Justin Guitar — 超过800节免费的吉他课程,有自己的app,还有电子书、DVD等实用内容。 数学,数据科学与工程 Codecad

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景:   骇客帝国特色背景在黑色中慢慢滚动着! 程序原理:  1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程   1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_center)   2

Java多线程编程模式实战指南:Two-phase Termination模式

文章来源: http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination?utm_source=infoq&utm_campaign=user_page&utm_medium=link 文章代码地址: https://github.com/Visce

[LeetCode] 583. Delete Operation for Two Strings

题:https://leetcode.com/problems/delete-operation-for-two-strings/description/ 题目 Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in

[LeetCode] 234. Palindrome Linked List

题:https://leetcode.com/problems/palindrome-linked-list/description/ 题目 Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2Output: false Example 2: Input: 1->2->

【HDU】4873 ZCC Loves Intersection 数学

传送门:【HDU】4873 ZCC Loves Intersection 题目大意:给你一个D维的空间,每个维度都有一条线段平行与该维度属于的轴(如X,Y,Z轴),且线段的端点坐标取值范围0~N-1,保证左端点严格小于右端点(除该维度,其他维度的值两端点均相等)。现在告诉你每条线段的左右端点的坐标都是随机的,0~N-1随机到的概率是完全相等的!现在如果两条线段如果相交于一点,你可以获得一点

CodeForces 425C Sereja and Two Sequences

题意: 两组数字a和b  如果a[i]等于b[j]  则可将a[i]和b[j]前所有数字删掉  这种操作花费e体力  得到1元钱  或者一次删掉所有数字  这种操作花费等于曾经删除的所有数字个数  做完后得到所有钱  问 一共s体力 可以得到多少钱 思路: dp+二分 由数据可知最多拿到300元钱  因此可以定义  dp[i][j]表示有i元钱时  b串删除到了j处时  a串删到的位

poj 1849 Two(树形dp求直径)

树的直径:一棵树中两个点间的最长距离。 Description The city consists of intersections and streets that connect them.  Heavy snow covered the city so the mayor Milan gave to the winter-service a list of streets that ha

day-49 让所有学生保持开心的分组方法数

思路 利用Collections.sort()函数对数组进行排序,依次向后遍历即可,如果nums.get(i)<i+1&&nums.get(i+1)>i+1 解题过程 注意特殊情况:全选和不选要单独讨论 Code class Solution {public int countWays(List<Integer> nums) {int len=nums.size();Collections