好久没有耍代码了,手有点生,还有点痒,and 脑子有点锈。话说这个简单的东西,耍了我一个小时。
主要是最近很少碰代码。二是对python不熟悉,刚刚接触,但是顿时很热爱这个小蟒蛇。于是打算好好蹂躏它。
题目链接:https://oj.leetcode.com/problems/intersection-of-two-linked-lists/
我的思路是这样的。
首先没有循环,所以不用判断是否绕一圈回来了。其次,看题意不会有多次分支,即分支只有一个,且一直相同到尾部。那么好办了。
我只需要逆向判断字符串是否相等就好了。
最后一个字符不相等。直接pass;反之,一直比较到看到不同的字符为止,输出就好了。
以上是我在实现之前的简单想法,貌似可行。但是实际实现的时候,发现很多细节问题遗漏了。这也是我很久没有摸代码的一个后果。
比如,碰到输入链表是空的,要处理;碰到一个字符串是另一个的子集,即在完成比较之前,就退出循环了,要处理;还有几个循环边界的问题。
所以说,感觉还是多码豆豆有好处。码豆豆给了我深度思考的习惯。
ok,上代码:
Runtime: 1576 ms 42 / 42 test cases passed.
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param two ListNodes
# @return the intersected ListNode
def getIntersectionNode(self, headA, headB):
listA = []
listB = []
if headA == None or headB == None:# 判断输入表是否为空
return None
while 1:#链表赋值到list中,方便从后面比较
if headA == None:
break;
listA.append(headA.val)
headA = headA.next
while 1:
if headB == None:
break;
listB.append(headB.val)
headB = headB.next
if listA[-1] != listB[-1]:# list最后一个元素不等
return None;
if len(listA)<len(listB):# 以最短链表长度为准比较
minLen = len(listA)
else:
minLen = len(listB)
inster = []
for i in range(1,minLen+1) # 边界问题,因为是逆向获取数据,因此,比较到第一个元素的时候。 listA[0] = listA[-len]
if listA[-i] != listB[-i]:
return ListNode(listA[-i+1])
if i== maxLen: #处理两个表存在子集的情况
return ListNode(listA[-i])
【总结一下】python中,list元素会出现index out of length的情况。python的基础不熟悉,产生了低级错误,应当多注意对list内容的审核,过滤。另,写的python程序总是不简洁。始终有c的影子在里面。 得多写写。
另外,作者的solution是这样的,提供了三个方法:
1、暴力搜索:对headA中每个元素,分别比较headB中每个元素。 0(mn)
2、hash表方法:对每个元素的address和值建立hash,第一个相等的,获取address。 python里面,可以用字典了。
3、两个指针的方法:这个方法有人实现了。 因为这个题目的特殊性,通过让较长的链表多走比较短链表长的步数,再同时移动两个链表的指针进行比较搜索的方法。实现的算法。总之都是简答题,权当熟悉语法。
keep on coding!