LeetCode 合并两个有序链表

合并两个有序链表


题目来源:https://leetcode-cn.com/problems/merge-two-sorted-lists/python

题目


将两个有序链表合并为一个新的有序链表并返回。新链表是经过拼接给定的两个链表的全部节点组成的。 segmentfault

示例:微信

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

解题思路


  1. 设定“哨兵节点”,用以正确返回合并后的链表;
  2. 控制 cur 指针,调整它的 next 指针;
  3. 比较两个链表的节点大小,将小的节点接在 cur 节点后面;
  4. 循环操做,当其中一个链表为空时终止;
  5. 若循环结束,其中一个链表不为空,则将剩余部分接在合并链表后面(由于两个链表都是有序的,因此剩余部分都比合并链表的元素大;
  6. 最后,返回合并的链表。

代码实现


# # 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

实现效果


merge_two_lists_result.jpg

以上为本篇的主要内容。

结语:祝你们新春大吉,平安喜乐spa

题外话:但愿你们作好我的防御,如非必要,尽可能不出门。指针

欢迎关注微信公众号《书所集录》
相关文章
相关标签/搜索