博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]--160. Intersection of Two Linked Lists
阅读量:5989 次
发布时间:2019-06-20

本文共 3843 字,大约阅读时间需要 12 分钟。

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.

因为受上面一个问题影响所以我想着先逆转后求后面的子串,其实想多了,只要有一个公共的就当时后面的全部是公共。

解法一:

第一遍循环,找出两个链表的长度差N
第二遍循环,长链表先走N步,然后同时移动,判断是否有相同节点
解法一就相对简单粗暴,容易理解。

/**  * Definition for singly-linked list.  * public class ListNode {  *     int val;  *     ListNode next;  *     ListNode(int x) {  *         val = x;  *         next = null;  *     }  * }  */  public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA==null || headB==null) return null; ListNode p = headA; ListNode q = headB; int pcount = 0; int qcount = 0; while(p.next != null || q.next != null) { if(p == q) return p; if(p.next != null) p = p.next; else ++qcount; if(q.next != null) q = q.next; else ++pcount; } if(p != q) return null; p = headA; q = headB; while(pcount-- != 0) { p = p.next; } while(qcount-- != 0) { q = q.next; } while(p != q) { p = p.next; q = q.next; } return p; } }

解法二:

链表到尾部后,跳到另一个链表的头部, 另外一个链表的引用移到最后,此时跳过来的引用所在点就为第二个链表的开始点,然后再次一起遍历,相遇即为intersection points.

/**  * Definition for singly-linked list.  * public class ListNode {  *     int val;  *     ListNode next;  *     ListNode(int x) {  *         val = x;  *         next = null;  *     }  * }  */  public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA==null || headB==null) return null; ListNode p = headA; ListNode q = headB; if(p == q) return p; while(p!=null && q!=null) { p = p.next; q = q.next; } if(p==null) p = headB; else q = headA; while(p!=null && q!=null) { p = p.next; q = q.next; } if(p==null) p = headB; else q = headA; while(p!=null && q!=null) { if(p==q) return p; p = p.next; q = q.next; } return null; } }

就是先一起移动,如果一个到头了,就指向另一个的头,另一个到尾了,就说明这个指向的就是下次一起开始的地方。

解法三:

用两个引用,一个快一个慢,快的每次移动两个节点,当。。。。。。。。。。。我以为我理解了,其实没理解,然后去打断点调试就发现出问题了,不过leetcode上面显示Accept!很奇怪,先贴个代码,等以后问问别人。

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        if (headA == null || headB == null) {            return null;        }        // get the tail of list A.        ListNode node = headA;        while (node.next != null) {            node = node.next;        }        node.next = headB;        ListNode result = listCycleII(headA);        node.next = null;        return result;    }    private ListNode listCycleII(ListNode head) {        ListNode slow = head, fast = head.next;        while (slow != fast) {            if (fast == null || fast.next == null) {                return null;            }            slow = slow.next;            fast = fast.next.next;        }        slow = head;        fast = fast.next;        while (slow != fast) {            slow = slow.next;            fast = fast.next;        }        return slow;    }

转载地址:http://mjilx.baihongyu.com/

你可能感兴趣的文章
Java 并发:第五部分 - 监视器(锁与条件锁)
查看>>
Lync问题解决之部分客户端不能显示照片
查看>>
python笔记 strip()方法
查看>>
如何去掉win2003 R2文件夹的只读属性|kb 326549 308418
查看>>
linux用户组管理
查看>>
Win10安装MySQL5.7.22 解压缩版(手动配置)方法
查看>>
Linux交流群42996402和设备驱动开发群19026441欢迎加入
查看>>
移动端优先策略下的css如何编写
查看>>
我的友情链接
查看>>
mysql中 字段类型转换后进行排序
查看>>
EXCEL中从×××号判断出身日期(求excel中×××提取年龄公式详解)
查看>>
IE下Ajax提交乱码的解决办法
查看>>
Netty Reactor模式实现原理详解
查看>>
GNS3与SecureCRT的关联问题(脚本)
查看>>
C++编译器与链接器工作原理
查看>>
Day6- php 链接MySQL
查看>>
jQuery.ajax 返回JSON数据 IE8 缓存问题
查看>>
长按移动Cell/Cell排序
查看>>
HQL 语法 明细
查看>>
Java中的util.Date,sql.Date,sql.Time,String类型转换
查看>>