python练习——链表3

链表练习——合并两个有序链表

    • 链表
    • 递归入门
    • Leetcode合并两个有序链表

链表

在python中定义一个链表的方式是这样的。这是一个节点,包括值和下一个节点的地址

class ListNode:
	def __init__(self, x):
		self.val = x
		self.next = Node

在代码中定义一个链表结构的变量的方式如下。这表示变量listnode是一个链表的头节点,它的值为value1,地址指向下一个节点。当然现在没有去指向下一个节点,还不知道下一个节点是什么。

listnode = ListNode(value1)

在后续代码中使用这个链表listnode时,通常会定义一个指针,表示当前的链表listnode的节点。代码和示意图如下

listnode_copy = listnode

python练习——链表3_第1张图片
当指向下一个节点时,代码和示意图如下

listnode_copy.next = listnode(value2)

python练习——链表3_第2张图片
将当前操作节点转到下一个节点上,代码和示意图如下

listnode_copy = listnode_copy.next

python练习——链表3_第3张图片
这时输出链表listnode,代码和示意图如下,这时链表中除了头节点外只有一个节点,因此输出仅有value2

return listnode.next

python练习——链表3_第4张图片
现在给出较长链表的代码和示意图

def readList(listnode_1 : ListNode) -> ListNode:
	listnode_2 = ListNode(0)
	listnode_2_copy = listnode_2
	while listnode_1 != None:
		listnode_copy.next = listnode_1
		listnode_copy = listnode_copy.next
		listnode_1 = listnode_1.next
	return listnode_2.next

python练习——链表3_第5张图片
python练习——链表3_第6张图片
python练习——链表3_第7张图片
python练习——链表3_第8张图片
python练习——链表3_第9张图片
python练习——链表3_第10张图片
python练习——链表3_第11张图片
python练习——链表3_第12张图片
python练习——链表3_第13张图片
python练习——链表3_第14张图片

递归入门

递归通俗的说就是“我”调用“我”。经典案例是斐波那契数列问题,第n个数是第(n-1)个数和第(n-2)个数之和。假如想知道数列的第5个数是多少,利用递归的思想,这里面f(x)是一个求和函数,输入x是数列中第x个数的位置,示意图和代码如下所示

python练习——链表3_第15张图片

def f(n):
	if n == 1 or n == 2:
		return 1
	return f(n - 1) + f(n - 2)

可以看出递归是同一个操作的反复使用,每次调用要不返回最后那个值的结果,然后回溯,要不就是继续调用这个函数。

Leetcode合并两个有序链表

问题描述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的

示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

python练习——链表3_第16张图片

思考
在这里面有两个链表,它们都是升序排列的,需要一个函数来对两个链表中的节点值进行比较,保留当前节点值小的那个节点,并返回,然后让它的next指向下一次的比较结果。在这里每次的“比较”就是需要进行递归的部分,示意图如下所示

python练习——链表3_第17张图片

解决方法

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
    	listnode_1 = l1
    	listnode_2 = l2
    	value_1 = listnode_1.val if listnode_1 else 0
    	value_2 = listnode_2.val if listnode_2 else 0
    	#递归终止的条件,要么listnode_1先被遍历完,要么listnode_2先被遍历完
    	if listnode_1 == None:
    		return listnode_2
    	if listnode_2 == None:
    		return listnode_1
    	#进行节点的比较,并调用递归
    	if value_1 <= value_2:
    		listnode_1.next = self.mergeTwoLists(listnode_1.next, listnode_2)
    		return listnode_1
    	if value_1 > value_2:
    		listnode_2.next = self.mergeTwoLists(listnode_1, listnode_2.next)
    		return listnode_2
    	#最终从最后一个节点开始回溯,将排列好的链表从头节点开始输出

你可能感兴趣的:(leetcode,python3笔记,链表,数据结构,python,leetcode)