[剑指 Offer 25. 合并两个排序的链表] | 刷题打卡

203 阅读1分钟

今天我们来做一道LeetCode上的题目,原题链接:剑指 Offer 25. 合并两个排序的链表

题目描述

  • 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
  • 示例1:
    输入:1->2->4, 1->3->4
    输出:1->1->2->3->4->4
  • 限制:
    0 <= 链表长度 <= 1000

思路分析

  • 暴力法
    • 循环获取l1、l2链表值到l_list
    • 使用l_list.sort(reverse=True)进行逆序排列
    • 变换list队列为l链表返回结果
  • 归并排序
    • 初始化伪头节点l = ListNode(0) ,cur节点指向伪头节点
    • 循环判断:While l1 and l2
    • 合并剩余尾部节点:cur.next = l1 if l1 else l2

代码

# Python
# 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
        """
        # # 1. 暴力排序
        # l_list = []
        # while l1:
        #     l_list.append(l1.val)
        #     l1 = l1.next
        # while l2:
        #     l_list.append(l2.val)
        #     l2 = l2.next
        # l_list.sort(reverse=True)
        # res = None
        # for i in l_list:
        #     if not res:
        #         res = ListNode(i)
        #     else:
        #         tmp = ListNode(i)
        #         tmp.next = res
        #         res = tmp
        # return res

        # 2. 链表直接排序
        l = cur = ListNode(0)
        while l1 and l2:
            if l1.val < l2.val:
                cur.next = l1
                l1 = l1.next
            else:
                cur.next = l2
                l2 = l2.next
            cur = cur.next         
        cur.next = l1 if l1 else l2
        return l.next

总结

  • 暴力方法更加容易理解
  • 归并排序速度更优

附录

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情