当前位置:   article > 正文

Python面试——剑指offer&leedcode刷题整理(链表)_python pa=pa==none?headb:pa.next

python pa=pa==none?headb:pa.next

1、相交链表

leetcode 160题

注意:

如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

  1. class Solution(object):
  2. def getIntersectionNode(self, headA, headB):
  3. """
  4. :type head1, head1: ListNode
  5. :rtype: ListNode
  6. """
  7. if not headA or not headB:
  8. return None
  9. pa = headA
  10. pb = headB
  11. while pa is not pb:
  12. #若无交点,则在none处相遇,退出循环
  13. if pa == None:
  14. pa = headB
  15. else:
  16. pa.next
  17. if pb == None:
  18. pb = headA
  19. else:
  20. pb.next
  21. return pa

2、环形链表

leetcode 141题

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

解法

判断链表中是否是有环,采用追赶法的思路,设置一个walker,每次走一步,设置一个runner,每次跑两步,当runner追上walkder时,说明链表中有环存在。

  1. # Definition for singly-linked list.
  2. # class ListNode(object):
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution(object):
  7. def hasCycle(self, head):
  8. """
  9. :type head: ListNode
  10. :rtype: bool
  11. """
  12. fast = slow = head
  13. while fast and slow and fast.next:
  14. slow = slow.next
  15. fast = fast.next.next
  16. if slow is fast:
  17. return True
  18. return False

3、合并两个有序链表

leetcode 21

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解法

很简单的链表拼接题,但是要注意两个地方
1、返回值要返回head.next
2、无需判断循环后哪个不为空,or返回第一个为真的值

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def mergeTwoLists(self, l1, l2):
  8. """
  9. :type l1: ListNode
  10. :type l2: ListNode
  11. :rtype: ListNode
  12. """
  13. head = ListNode(0) #创建一个新的头节点
  14. current_node = head #新链表的当前节点
  15. while l1 != None and l2 != None: #l1和l2 存在
  16. if l1.val > l2.val: #l1值大于l2,将l2值插进来,遍历l2
  17. head.next = l2
  18. l2 = l2.next
  19. else :
  20. head.next = l1
  21. l1 = l1.next
  22. head = head.next #一次比较后,继续遍历
  23. if l1 == None:
  24. head.next = l2
  25. elif l2 == None:
  26. head.next = l1
  27. return current_node.next

4、删除链表中的重复元素

leetcode 83题

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2
示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def deleteDuplicates(self, head: ListNode) -> ListNode:
  8. if not head:
  9. return head
  10. p = head
  11. q = head.next
  12. while q:
  13. if p.val == q.val:
  14. p.next = q.next
  15. q = q.next
  16. else:
  17. p = p.next
  18. q = q.next
  19. return head

法二:

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def deleteDuplicates(self, head: ListNode) -> ListNode:
  8. cur = head
  9. while cur:
  10. while cur.next and cur.val == cur.next.val:
  11. cur.next = cur.next.next
  12. cur = cur.next
  13. return head

5、移出链表元素

leetcode 203

删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

解法

"有了第83题的思路,我们这里可以用一个指针来进行链表的遍历,但是这里需要注意的是,头节点也需要进行判断,如果头节点的值等于val的话,我们不能返回头节点,所以这里很巧妙的重新生成了一个无关的头节点。

  1. class Solution(object):
  2. def removeElements(self, head, val):
  3. """
  4. :type head: ListNode
  5. :type val: int
  6. :rtype: ListNode
  7. """
  8. dummy = ListNode(-1)
  9. dummy.next = head
  10. cur = dummy
  11. while cur:
  12. while cur.next and cur.next.val == val:
  13. cur.next = cur.next.next
  14. cur = cur.next
  15. return dummy.next

6、翻转链表

leetcode 206

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

解法

链表转置,这里实在想不到一个指针的解法了,只能用两个指针,再加上head的帮忙,p指针记录的是每次的队头元素,q指针指向下一个要插入队头的元素。

可参考:https://blog.csdn.net/feliciafay/article/details/6841115

方法一:

  1. # Definition for singly-linked list.
  2. # class ListNode(object):
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution(object):
  7. def reverseList(self, head):
  8. """
  9. :type head: ListNode
  10. :rtype: ListNode
  11. """
  12. if head == None:
  13. return None
  14. p = head
  15. q = head.next
  16. head.next = None
  17. while q:
  18. r = q.next
  19. q.next = p
  20. p = q
  21. q = r
  22. head = p
  23. return head

方法二:

  1. # Definition for singly-linked list.
  2. # class ListNode(object):
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution(object):
  7. def reverseList(self, head):
  8. """
  9. :type head: ListNode
  10. :rtype: ListNode
  11. """
  12. if head == None:
  13. return None
  14. if head.next == None:
  15. return head
  16. p = head.next
  17. while p.next != None:
  18. q = p.next
  19. p.next = q.next
  20. q.next = head.next
  21. head.next = q
  22. p.next = head
  23. head = p.next.next
  24. p.next.next = None
  25. return head

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/1005109
推荐阅读
相关标签
  

闽ICP备14008679号