链表练习——合并两个有序链表
链表
在python中定义一个链表的方式是这样的。这是一个节点,包括值和下一个节点的地址
class ListNode:
def __init__(self, x):
self.val = x
self.next = Node
在代码中定义一个链表结构的变量的方式如下。这表示变量listnode是一个链表的头节点,它的值为value1,地址指向下一个节点。当然现在没有去指向下一个节点,还不知道下一个节点是什么。
listnode = ListNode(value1)
在后续代码中使用这个链表listnode时,通常会定义一个指针,表示当前的链表listnode的节点。代码和示意图如下
listnode_copy = listnode
当指向下一个节点时,代码和示意图如下
listnode_copy.next = listnode(value2)
将当前操作节点转到下一个节点上,代码和示意图如下
listnode_copy = listnode_copy.next
这时输出链表listnode,代码和示意图如下,这时链表中除了头节点外只有一个节点,因此输出仅有value2
return listnode.next
现在给出较长链表的代码和示意图
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
递归入门
递归通俗的说就是“我”调用“我”。经典案例是斐波那契数列问题,第n个数是第(n-1)个数和第(n-2)个数之和。假如想知道数列的第5个数是多少,利用递归的思想,这里面f(x)是一个求和函数,输入x是数列中第x个数的位置,示意图和代码如下所示
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
思考:
在这里面有两个链表,它们都是升序排列的,需要一个函数来对两个链表中的节点值进行比较,保留当前节点值小的那个节点,并返回,然后让它的next指向下一次的比较结果。在这里每次的“比较”就是需要进行递归的部分,示意图如下所示
解决方法:
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
#最终从最后一个节点开始回溯,将排列好的链表从头节点开始输出