一.问题描述
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
#合并两个有序链表,当然要求结果也是有序链表
#Definition for singly-linked list.
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
二.代码编写
稍作思考,便知对有序链表的合并是通过两个指针来遍历实现的,时间复杂度O(m+n)
class Solution(object):
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
if l1 == None and l2 == None:
return None
elif l1 == None:
return l2
elif l2 == None:
return l1
elif l1.val < l2.val:
rNode = ListNode(l1.val)
i = l1.next
j = l2
else:
rNode = ListNode(l2.val)
i = l1
j = l2.next
rN = rNode
while i != None and j != None:
if i.val < j.val:
rN.next = ListNode(i.val)
i = i.next
else:
rN.next = ListNode(j.val)
j = j.next
rN = rN.next
if i != None:
rN.next = i
elif j != None:
rN.next = j
return rNode
三.算法改进
上述算法ac之后运行时间仅仅打败百分之十几的算法提交,同时不得不说其代码也实在是冗长- -。
两个可改进的地方:
1)给链表添加一个头结点,则可减少多次对链表是否为None的判断(输出的时候再去掉头结点即可)。
2)不用每次新建一个ListNode节点添加在返回链表上,只用将原结点接在输出结点后面就好。
class Solution(object):
'''
题意:合并两个有序链表
'''
def mergeTwoLists(self, l1, l2):
dummy = ListNode(0)
tmp = dummy
while l1 != None and l2 != None:
if l1.val < l2.val:
tmp.next = l1
l1 = l1.next
else:
tmp.next = l2
l2 = l2.next
tmp = tmp.next
if l1 != None:
tmp.next = l1
else:
tmp.next = l2
return dummy.next
注:经测试,第二节中原始代码运行时间为88ms,对2)进行改进之后为69ms,对1)2)均进行改进之后(得上述代码)运行时间为52ms。
总结:对链表而言,头结点在关键时候很有用!~