目录
这篇文章是总结一些简单的链表题,使用的方法是只写了其中的一种,方法不唯一。
1.环形列表
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if not head or not head.next :
return False
slow = head
fast = head
while (fast and fast.next):
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
2. 合并两个有序链表
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if not l1:
return l2
if not l2:
return l1
if l1.val <l2.val:
l1.next = self.mergeTwoLists(l1.next,l2)
return l1
else:
l2.next = self.mergeTwoLists(l1,l2.next)
return l2
3. 相交链表
class Solution(object):
def getIntersectionNode(self, headA, headB):
ha, hb = headA, headB
while ha != hb:
ha = ha.next if ha else headB
hb = hb.next if hb else headA
return ha
4. 回文链表
def isPalindrome(self, head: ListNode) -> bool:
vals = []
current_node = head
while current_node is not None:
vals.append(current_node.val)
current_node = current_node.next
return vals == vals[::-1]
5. 反转链表
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
pre = None
while (head):
cur = head.next
head.next = pre
pre = head
head = cur
return pre
6. 删除链表的节点
class Solution:
def deleteNode(self, head: ListNode, val: int) -> ListNode:
pre = ListNode(-1)
pre.next = head
if head.val == val:return head.next
while head and head.next:
if head.next.val == val:
head.next = head.next.next
head = head.next
return pre.next
7. 链表中倒数第k个节点
class Solution:
def __init__(self):
self.i = 0
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
return self.getNode(head,k)
def getNode(self,head,k):
if not head:
return 0
# if not head.next:
# return 0
res = self.getNode(head.next,k)
self.i += 1
if self.i == k:
return head
return res