代码随想录算法训练营第四天

42 阅读2分钟

24.两两交换链表中的节点

交换链表节点重点就是把交换逻辑写清楚即可。

# 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(0)
        dummy.next=head
        cur=dummy
        while cur.next and cur.next.next :
            slow=cur.next
            fast=cur.next.next.next
            cur.next=cur.next.next
            cur.next.next=slow
            slow.next=fast

            cur=cur.next.next
        return dummy.next

19.删除链表的倒数第n个节点

关键在于如何找到倒数第n个节点。本题可以利用双指针的方法去解决。
我们先让fast移动n+1个长度。再让fast和slow一起移动,直到fast指针指向None. 删除操作很简单,就是slow.next=slow.next.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]:
        #找到第n-1个节点,让这个节点指向第n+1个节点。然后让第n个节点指向None
        dummy=ListNode(0)
        dummy.next=head
        cur=dummy
        fast,slow=dummy,dummy
        for _ in range(n+1):
            fast=fast.next
        while fast :
            fast=fast.next
            slow=slow.next
        slow.next=slow.next.next
        return dummy.next

160.相交链表

本题也用了类似上一题的想法,计算出两条列表的长度。然后让长的那一条去移动m-n个长度。然后两条链表一起移动。看能不能找到相同节点

# 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:
        #先求出两条链表长度的差值
        len_a=0;len_b=0
        dummy_a=ListNode(0)
        dummy_b=ListNode(0)
        dummy_a.next=headA
        dummy_b.next=headB
        cur_a,cur_b=dummy_a,dummy_b
        while cur_a is not None:
            cur_a=cur_a.next
            len_a+=1
        while cur_b is not None:
            cur_b=cur_b.next
            len_b+=1
        new_a=dummy_a;new_b=dummy_b
        if len_a > len_b:
            for _ in range(len_a-len_b):
                new_a=new_a.next
        else:
            for _ in range(len_b-len_a):
                new_b=new_b.next
        
        while new_a is not None or new_b is not None:
            if new_a == new_b:
                return new_a
            else:
                new_a=new_a.next
                new_b=new_b.next
        return None

142.环形链表Ⅱ

重要的是搞懂数学的推导,头位置、环起始位置、快慢指针相遇位置之间的关系。做出这道题就不难

# 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 fast and fast.next:
            slow=slow.next
            fast=fast.next.next
            if slow==fast:
                slow=head
                while fast != slow:
                    fast=fast.next
                    slow=slow.next
                return slow
        return None