lintcode 中等题:Intersection of Two Linked Lists 两个链表的交叉
题目
两个链表的交叉
请写一个程序,找到两个单链表最开始的交叉节点。
下列两个链表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
在节点 c1 开始交叉。
- 如果两个链表没有交叉,返回
null。 - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
需满足 O(n) 时间复杂度,且仅用 O(1) 内存。
解题
尝试用时间复杂度是O(NM),却没有解决,在这个博客看到根据两个链表的特性进行解决。
就如同上图,两个链表相交的部分一定在尾部的,如果两个链表尾部对齐,按照短的链表头节点开始,同时时对两个链表进行遍历,找到相同节点处就是共同的节点。
这里为了找到短链表的都节点在长链表处的位置<这里的位置是相对的,他们不一定是在一起的,这里只是为了让尾对齐>。先求两个链表的长度
假设长链表是A 长度lenA 短链表B 长度LenB
长链表头节点开始走,并lenA-=1 当lenA==lenB的时候说明链表尾部对齐了,这样就开始直接按顺序比较链表节点值是否相等了。时间复杂度是O(M+N)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None class Solution:
# @param headA: the first list
# @param headB: the second list
# @return: a ListNode
def getIntersectionNode(self, headA, headB):
# Write your code here
if headA == None:
return None
if headB == None:
return None
lenA = self.getLength(headA)
lenB = self.getLength(headB)
A = None
B = None
if lenA > lenB:
A = headA
B = headB
else:
A = headB
B = headA
tmp = lenA
lenA = lenB
lenB = tmp
while lenA>lenB:
lenA -=1
A = A.next
while A and B:
if A.val == B.val:
return A
A = A.next
B = B.next def getLength(self,head):
length = 0
p = head
while p!=None:
p = p.next;
length +=1
return length
Python Code
总耗时: 340 ms.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param headA: the first list
* @param headB: the second list
* @return: a ListNode
*/
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// Write your code here
if(headA == null)
return null;
if(headB == null)
return null;
if(headA == headB )
return headA;
// 求 A B的长度
int lenA = getLength(headA);
int lenB = getLength(headB);
ListNode A = null;
ListNode B = null;
// A是比较长的链表
if(lenA>lenB){
A = headA;
B = headB;
}else{
A = headB;
B = headA;
int tmp = lenA;
lenA = lenB;
lenB = tmp;
}
while(lenA>lenB){
A = A.next;
lenA--;
} while(A!=null && B!=null){
if(A.val == B.val){
return A;
}
A = A.next;
B = B.next;
}
return null;
}
public int getLength(ListNode head){
int length = 0;
ListNode p = head;
while(p!=null){
length++;
p = p.next;
}
return length;
}
}
Java Code
总耗时: 2028 ms
lintcode 中等题:Intersection of Two Linked Lists 两个链表的交叉的更多相关文章
- intersection of two linked lists.(两个链表交叉的地方)
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- leetcode:Intersection of Two Linked Lists(两个链表的交叉点)
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- [LC]141题 Intersection of Two Linked Lists (相交链表)(链表)
①中文题目 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 注意: 如果两个链表没有交点,返回 null.在返回结果后,两个链表仍须保持原有的结构.可假定整 ...
- [LeetCode]160.Intersection of Two Linked Lists(2个链表的公共节点)
Intersection of Two Linked Lists Write a program to find the node at which the intersection of two s ...
- LeetCode算法题-Intersection of Two Linked Lists(Java实现)
这是悦乐书的第178次更新,第180篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第37题(顺位题号是160).编写程序以找到两个单链表交叉的节点.例如: 以下两个链表: ...
- [LeetCode] Intersection of Two Linked Lists 两链表是否相交
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- Intersection of Two Linked Lists两链表找重合节点
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- [LintCode] Intersection of Two Linked Lists 求两个链表的交点
Write a program to find the node at which the intersection of two singly linked lists begins. Notice ...
- [LeetCode] 160. Intersection of Two Linked Lists 解题思路
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
随机推荐
- 用golang启动一个daemon
用golang启动一个daemon package main import ( "fmt" "log" "os" "runtime ...
- dedecms 分页样式
<div class="dede_pages"> <ul class="pagelist"> {dede:pagelist lis ...
- WCF完全解析读书笔记第2章地址
1. 使用同一个绑定对象实现地址跨终结点共享 2. 地址报头帮助辅助寻址 3. 使用端口共享为多个服务使用相同端口 4. WCF终结点地址分为逻辑地址和物理地址, 客户端使用ClientViaBeha ...
- Delphi XE5教程3:实例程序
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- GridView数据源绑定的一个小问题
在使用GridView绑定数据源的时候,遇到了一个问题,因为图简单,没有注意到,贴出错误截图: 找了半天没有找出错误,在网上找了之后,才发现是一个细节引起的错误. 后台是这样写的: namespace ...
- Oracle 10g 数据文件的第一个数据块结构
一.数据文件的第一个数据块结构kcvfh BBED> set file 1 FILE# 1 BBED> set block 1 BLOCK# 1 --查看第一个数据块的整体结构 BBED& ...
- VS2010配色方案
http://studiostyl.es/ 导入步骤: 工具------------导入和导出设置------------导入选定的环境设置------------否,仅导入新设置--------- ...
- Protocol Buffer使用
Protocol Buffer使用简介 字数2630 阅读5067 评论1 喜欢12 我们项目中使用protocol buffer来进行服务器和客户端的消息交互,服务器使用C++,所以本文主要描述pr ...
- 初涉Node.js
Node.js的是建立在Chrome的JavaScript的运行时,可方便地构建快速,可扩展的网络应用程序的平台. Node.js使用事件驱动.非阻塞I/ O模型,是轻量级.高效.完美的跨分布式设备运 ...
- LintCode-Kth Prime Number.
Design an algorithm to find the kth number such that the only prime factors are 3, 5, and 7. The eli ...