时间:2020-5-11
题目地址:https://leetcode-cn.com/problems/merge-two-sorted-lists/
题目难度:Easy
题目描述:
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路1:
- 取出链表的元素到列表
- 使用列表排序
- 构建输出链表
代码段1:通过
# 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:
if not l1 and not l2:
return []
temp = []
while l1 and l2:
temp.append(l1.val)
l1 = l1.next
temp.append(l2.val)
l2 = l2.next
if l1:
while l1:
temp.append(l1.val)
l1 = l1.next
if l2:
while l2:
temp.append(l2.val)
l2 = l2.next
temp.sort()
head = ListNode(temp.pop(0))
start = head
while temp:
temp2 = ListNode(temp.pop(0))
head.next = temp2
head = temp2
return start
总结:链表这个结构没用过,看到定义的ListNode一脸懵,也找不到好的资料,直接看了评论写出来的
链表的每个节点包含数据项和指针,头结点没有父指针,尾节点没有子指针
链表的数据结构见下图,需要额外维护指针,因此相比较列表(python)来说空间复杂度高
链表的插入操作可通过修改两个指针指向进行,见下图,相比较列表(python)通过索引插入的方式,链表插入可节省时间复杂度为o(1)
链表的删除操作可通过修改指针执行进行,见下图,相比较列表(python)通过索引或值删除的方式,链表删除可节省时间复杂度为o(1)
思路2:递归
代码段2:通过
# 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:
if l1 and l2:
if l1.val > l2.val: l1, l2 = l2, l1
l1.next = self.mergeTwoLists(l1.next, l2)
return l1 or l2
总结:
- 多写多练,下边是简单但经典的递归题目
思路3:迭代
代码段3:通过
# 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:
prehead = ListNode(-1)
prev = prehead
while l1 and l2:
if l1.val <= l2.val:
prev.next = l1
l1 = l1.next
else:
prev.next = l2
l2 = l2.next
prev = prev.next
prev.next = l1 if l1 else l2
return prehead.next
总结:
- 这个应该是第一个想到的思路,最近有点晕晕的