day4

36 阅读1分钟

注意循环的条件(什么时候停止

注意空指针的问题

注意链表节点next属性改变的顺序(画图,注意改变之后原来的next指针就没了,可以借助temp变量临时保存

更新链表滑动的指针时要按新链表的顺序来

# 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_head = ListNode(next=head)
        cur = head
        pre = dummy_head
        while(cur != None):
            if cur.next == None:
                break
            pre.next = cur.next
            temp = cur.next.next
            cur.next.next = cur
            cur.next = temp
            pre = pre.next.next
            cur = cur.next
        return dummy_head.next

增加虚拟头节点来统一操作

class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        i = 1
        fakehead = ListNode(next=head)
        cur = head
        fin = fakehead
        while(cur.next != None):
            cur = cur.next
            i += 1
            if(i > n):
                fin = fin.next
        fin.next = fin.next.next
        return fakehead.next

注意链表相交可以从长度入手
对齐

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        lenA, lenB = 0, 0
        cur = headA
        while cur:         # 求链表A的长度
            cur = cur.next 
            lenA += 1
        cur = headB 
        while cur:         # 求链表B的长度
            cur = cur.next 
            lenB += 1
        curA, curB = headA, headB
        if (lenA <= lenB):
            curA = headB
            curB = headA
        diff = abs(lenA-lenB)
        for i in range(diff):
            curA = curA.next
        while(curB):
            if curA == curB:
                return curA
            curA = curA.next
            curB = curB.next
        return None

第一,如何判断有环?通过快慢指针相遇来判断 第二,如何确定入环结点?数学建模一下,还是用快慢指针相遇。 记一下套路