24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点, 面试题 02.07. 链表相交 ,142. 环形链表 II

思路 根据图来理清思路 使用三个容器来储藏节点

将三个节点放进三个容器,分别修改每个容器的指针

while 当前节点的下两个节点不为空

代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        dummy=ListNode(next=head)
        cur=dummy
        while cur.next and cur.next.next:
            tmp1=cur.next 
            tmp2=cur.next.next
            tmp3=cur.next.next.next
            cur.next=tmp2
            tmp2.next=tmp1 
            tmp1.next=tmp3 
            cur=tmp1
        return dummy.next

思路
遍历每个节点来获取链表长度

让链表走到删除节点的上一个节点

修改指针

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        index=0
        dummy=ListNode(next=head)
        cur=dummy
        while cur.next:
            cur=cur.next
            index+=1

        cur=dummy
        for i in range(index-n):
            cur=cur.next

        cur.next=cur.next.next
        return dummy.next

思路

没想出来,借鉴了K的解法

双指针,指针在列表尾部则转移到另一条链表头

如果有公共节点,那么两个节点会相遇

否则会同时在null节点

代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        A,B=headA,headB
        while A!=B:
            A=A.next if A else headB
            B=B.next if B else headA 
        return A

思路

根据快慢指针,快指针走两步,慢指针走一步

快慢如果在环中相遇,快指针快n圈,此时慢指针走a步就能走到起点,将快指针移到起点位置

代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        slow=head 
        fast=head
        while True:
            if  fast and fast.next:
                slow=slow.next
                fast=fast.next.next
                if fast==slow:
                    break
            else:
                return 
        fast=head 
        while fast!=slow:
            fast,slow=fast.next,slow.next
        return fast

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值