合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if not l1: return l2 # 终止条件,直到两个链表都空 if not l2: return l1 if l1.val <= l2.val: # 递归调用 l1.next = self.mergeTwoLists(l1.next,l2) return l1 else: l2.next = self.mergeTwoLists(l1,l2.next) return l2
删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3
# class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def deleteDuplicates(self, head: ListNode) -> ListNode: if head is None or head.next is None: return head child = self.deleteDuplicates(head.next) if child and head.val == child.val: head.next = child.next child.next = None return head
理解为:
206. 反转链表 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def reverseList(self, head: ListNode) -> ListNode: cur, pre = head, None while cur: cur.next, pre, cur = pre, cur, cur.next return pre
234. 回文链表 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def isPalindrome(self, head: ListNode) -> bool: stack = [] slow = head fast = head while(fast and fast.next): stack.append(slow) slow = slow.next fast = fast.next.next if fast: # 奇数 slow = slow.next while(stack): curr = stack.pop() if curr.val != slow.val: return False slow = slow.next return True
链表的中间结点 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5]) 返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。 注意,我们返回了一个 ListNode 类型的对象 ans,这样: ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL. 示例 2: 输入:[1,2,3,4,5,6] 输出:此列表中的结点 4 (序列化形式:[4,5,6]) 由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
class Solution: def middleNode(self, head: ListNode) -> ListNode: fast, slow = head, head while(fast and fast.next): fast = fast.next.next slow = slow.next return slow
二进制链表转整数 给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 输入:head = [1,0,1] 输出:5 解释:二进制数 (101) 转化为十进制数 (5)
class Solution: def getDecimalValue(self, head: ListNode) -> int: rec = 0 while head != None: rec = rec * 2 + head.val # 相当于rec = rec<<1 | head.val head = head.next return rec
相交链表
编写一个程序,找到两个单链表相交的起始节点。
class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: A = set() cur1 = headA cur2 = headB while cur1: A.add(cur1) cur1 = cur1.next while cur2: if cur2 in A: return cur2 cur2 = cur2.next return None class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: ha, hb = headA, headB while ha != hb: #互相走一下对方的路,就能相遇 ha = ha.next if ha else headB hb = hb.next if hb else headA return ha
链表问题总结为: 1)递归处理 2)双指针,快慢指针 3)迭代
4)hash