合并两个有序链表
题目来源:https://leetcode-cn.com/problems/merge-two-sorted-lists/
题目
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题思路
- 设定“哨兵节点”,用以正确返回合并后的链表;
- 控制
cur
指针,调整它的next
指针; - 比较两个链表的节点大小,将小的节点接在
cur
节点后面; - 循环操作,当其中一个链表为空时终止;
- 若循环结束,其中一个链表不为空,则将剩余部分接在合并链表后面(因为两个链表都是有序的,所以剩余部分都比合并链表的元素大;
- 最后,返回合并的链表。
代码实现
# # Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
'''将两个有序链表合并成一个链表然后返回
Args:
l1: 有序链表 1
l2: 有序链表 2
Returns:
返回合并后的有序链表
'''
# 定义一个哨兵节点,用以正确返回合并后的链表
pre_head = ListNode(None)
# 控制 cur 指针,比较节点大小
cur = pre_head
# 比较两个链表的节点大小,当两个链表任意一个为空,则终止
while l1 and l2:
# 当 l1 的节点较小,则指针指向 l1,同时向后移
if l1.val < l2.val:
cur.next, l1 = l1, l1.next
else: # 否则,指针指向 l2,同时向后移
cur.next, l2 = l2, l2.next
# 维护 cur 指针
cur = cur.next
# 考虑其中任意一个链表为空,将非空的链表拼接在合并链表后面
cur.next = l1 if l1 else l2
return pre_head.next
实现效果
以上为本篇的主要内容。
结语:祝大家新春大吉,平安喜乐
题外话:希望大家做好个人防护,如非必要,尽量不出门。
欢迎关注微信公众号《书所集录》