LeetCode每周记录-5

Posted HorribleMe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode每周记录-5相关的知识,希望对你有一定的参考价值。

将两串链表合并成一串(保持有序)。题目很简单,思路是用两个指针分别遍历两串链表,同时比较节点值,取小的那一边并将指针向右移动。代码:

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

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if not l1 and not l2:
            return None
        if not l1:
            start = l2
        elif not l2:
            start = l1
        else:
            start = l1 if l1.val <= l2.val else l2
        if start == l1:
            p, q = start.next, l2
        else:
            p, q = l1, start.next
        currNode = start
        while(p or q):
            if p and q:
                if p.val <= q.val:
                    currNode.next = p
                    currNode = p
                    p = p.next
                else:
                    currNode.next = q
                    currNode = q
                    q = q.next
            elif p:
                currNode.next = p
                currNode = p
                p = p.next
            elif q:
                currNode.next = q
                currNode = q
                q = q.next
            else:
                pass
        return start
            
        

 

 

给出一个整数n,用n个括号()来组成不同的字符串,给出所有的可能。思路是利用括号的合法要求,通过递归,在2 * n长度的字符串中按从左到右的顺序添加左括号或右括号,每添加一个左括号将其加入到一数组中存储,每添加一个右括号检查数组中是否有剩余的左括号(有则删除一个左括号,无则停止递归),在中途有提前停止递归的一些方法(比如左括号的数量已经超过了n),递归停止时左括号剩余0个,则得到一个可能性。代码:

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        allParentheses = []
        tempSave = []
        _tempSave = \'\'
        self._generateParenthesis(tempSave, _tempSave, \'(\', allParentheses, n - 1, n)
        return allParentheses
    
    def _generateParenthesis(self, tempSave, _tempSave, sign, allParentheses, leftCount, rightCount):
        _tempSave += sign
        if leftCount == 0 and rightCount == 0:
            if tempSave[-1] == \'(\' and sign == \')\':
                allParentheses.append(_tempSave)
            return
        if sign == \')\':
            if tempSave and tempSave[-1] == \'(\':
                tempSave.pop()
                if leftCount > 0:
                    self._generateParenthesis([x for x in tempSave], _tempSave, \'(\', allParentheses, leftCount - 1, rightCount)
                if rightCount > 0:
                    self._generateParenthesis([x for x in tempSave], _tempSave, \')\', allParentheses, leftCount, rightCount - 1)
            else:
                return
        else:
            tempSave.append(sign)
            if leftCount > 0:
                self._generateParenthesis([x for x in tempSave], _tempSave, \'(\', allParentheses, leftCount - 1, rightCount)
            if rightCount > 0:
                self._generateParenthesis([x for x in tempSave], _tempSave, \')\', allParentheses, leftCount, rightCount - 1)

 

 

合并k个有序链表,返回一个有序链表。思路是用数组来帮忙存储所有节点的值,最后利用记录下来的所有值重新创建一个新的链表。代码:

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

class Solution(object):
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        mergeList = []
        for _list in lists:
            tempList = []
            p = _list
            while(p):
                tempList.append(p.val)
                p = p.next
            mergeList += tempList
        mergeList.sort()
        start, p, q = None, None, None
        print mergeList
        if mergeList:
            for i in mergeList:
                node = ListNode(i)
                if not start:
                    start = p = q = node
                else:
                    if p == q:
                        q = node
                        p.next = q
                    else:
                        p = q
                        q = node
                        p.next = q
        return start
                    
                
                
            

 

 

 

 

给出一串链表,将这串链表节点两两置换(前后位置交换,不能通过改变值实现)。按着题目的要求做节点的位置交换即可,注意做完置换后跳到下一组节点的位置,以及置换后与相邻节点联系的建立。代码:

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

class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head:
            return
        if not head.next:
            return head
        p = q = head
        while(p and p.next):
            _p = p
            pnext = p.next
            if q == head:
                head = pnext
                _p.next = pnext.next
                head.next = _p
                p = _p.next
            else:
                q.next = pnext
                _p.next = pnext.next
                pnext.next = _p
                p = _p.next
            q = _p
        return head
        

 

 

 

上一题的升级版,给出一串链表,每k个节点进行一次逆序操作(不满k个节点则不进行操作)。思路是用数组帮忙实现,一边遍历链表,一边将节点存储到数组中,每存储k个节点,对数组进行逆序操作,然后将逆序后的头尾节点与链表重新连结起来。代码:

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

class Solution(object):
    def reverseKGroup(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        if k <= 1:
            return head
        tempList = []
        i = 0
        p = q = head
        while(p or i == k):
            if i == k:
                if q == head:
                    tempList.reverse()
                    head = tempList[0]
                    for j, node in enumerate(tempList[0:-1]):
                        node.next = tempList[j + 1]
                else:
                    tempList.reverse()
                    q.next = tempList[0]
                    for j, node in enumerate(tempList[0:-1]):
                        node.next = tempList[j + 1]
                tempList[-1].next = p
                q = tempList[-1]
                i = 0
                tempList = []
            i += 1
            tempList.append(p)
            p = p.next if p else None
        return head

 

 

 

给出一个有序整数数组,将里面重复的数移除。由于是有序数组,相同的数一定在一起,所以用一个变量记录上一个数的值即可,遍历一遍数组,遇到与上一个数相同的进行删除,同时遍历的序号不增;不同的话则不进行操作,序号增加。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return
        i = 1
        currNum = nums[0]
        while(i <= len(nums) - 1):
            if nums[i] == currNum:
                nums.pop(i)
            else:
                currNum = nums[i]
                i += 1
        return len(nums)

 

 

(27题在之前的博客中做过)。给出总字符串和目标字符串,找出目标字符串在总字符串中的位置,返回位置序号或者-1。利用Python字符串的index即可。

class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        try:
            return haystack.index(needle)
        except:
            return -1
        

 

以上是关于LeetCode每周记录-5的主要内容,如果未能解决你的问题,请参考以下文章

leetcode每周记录

每周总结(第十一至第十四周)

资料 | 从 0 开始刷 LeetCode 的心得记录

团队交流记录 - 2020-04

LeetCode每周算法零钱兑换

LeetCode每周算法零钱兑换