【前言】坚持日更LeetCode刷题系列
不积跬步,无以至千里;不积小流,无以成江海。愿与诸君共勉!
【题目】21.合并两个有序链表
题目描述:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
示例 1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路一:
创建一个空链表,当两个链表的值依次比较,较小的值加入到链表中,直到有一个链表节点所在位置为空,此时将另一个链表直接加入到创建的链表中。具体代码如下:
# 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
"""
l3 = ListNode(-1) #定义空链表
prev = l3
#思考一下,如果不用prev进行下面的操作,而是直接用l3会是怎样呢?
while l1 and l2: #当l1或l2为空时,结束循环
if l1.val <= l2.val:
prev.next = l1 #l1值小于l2值,则将prev的下一个指针指向l1
l1 = l1.next #并且通过指针的方式更新l1位置
elif l1.val > l2.val:
prev.next = l2
l2 = l2.next
prev = prev.next #更新prev位置
if l1:
prev.next = l1 #l2为空则添加l1
else:
prev.next = l2 #l1为空则添加l2
return l3.next
运行结果:
思路二:
采用递归的思想,每次将比较为小的元素的节点作为头节点,依次返回。直到其中一个为空时结束此过程。具体代码如下:
# 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 l1 is None:
return l2
elif l2 is None:
return l1
elif l1.val<=l2.val:
l1.next = self.mergeTwoLists(l1.next,l2)
return l1
else:
l2.next = self.mergeTwoLists(l1,l2.next)
return l2
运行结果:
关于其中一些知识的链接:
分享就到这里了,欢迎大家一起交流讨论。
注明
:
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/