作者:CYL
日期:2020-10-11
标签:有序链表
问题描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题思路:
- 思路一、最傻逼的方法是遍历一遍然后把值存在列表里面 然后 对列表排序 再构建新的有序链表 如果给定两个无序链表 那这种方法是切实有效的 但是当给定两个有序链表显然不太合适
- 思路二、两个指针 分别 指向 list1 和 list2 然后每一次取小的链接到新的链表后面
但是这样会多占用位置(下列代码是这么实现的) - 思路三、比较list1 list2的头 的val 然后取比较小的链表 作为新链表的体。依次取小的节点往该链表中插入
好处是 不会产生新的节点 不占用新的空间 思路清楚的话 代码量也会更小
坏处是 逻辑稍微复杂辣么一丢丢
代码:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
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
x = l1 #指针x
y = l2 #指针y
new_list = ListNode()
z = new_list #指针z 指向新列表
while not x is None and not y is None:
if x.val <= y.val :
new_node = ListNode(val = x.val)
z.next = new_node
z = z.next
x = x.next
else:
new_node = ListNode(val=y.val)
z.next = new_node
z = z.next
y = y.next
if x is None :
z.next = y
elif y is None:
z.next = x
new_list = new_list.next
return new_list