原题链接:
https://leetcode-cn.com/problems/merge-two-sorted-lists/description/
题目描述
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
复制代码
题目解析:
题目给出了两个链表,链表中的元素都是有序排列的(一般是从小到大排列)。要求的结果是返回一个链表,这个链表包括了给出的两个链表的元素,并且也是按照有序排列的。
需要做题者熟悉链表结构和链表的遍历。
思路
首先同时遍历两个链表,比较两个链表当前的值,小的值就作为新链表的元素,然后小的值的链表就走到下一个元素,大的值的链表还是当前元素。接着继续遍历,重复上述步骤,直到链表遍历完毕。这样就可以得到新的有序链表了。 需要注意几个地方:
- 这个题目,最好是创建一个头结点来作为辅助,这样就不用判断新链表的头结点是l1的头结点还是l2的头结点了。
- 遍历到最后,一般会有一个链表是先遍历完毕的。接着将另外一个链表拼接起来就行了,不用继续再一个个遍历拼接。
代码(Python)
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
#先判断与一个链表为空的情况
if l1 == None:
return l2
if l2 == None:
return l1
#新建一个头结点作为辅助
head = ListNode(0)
#currentNode为新链表的当前节点
currentNode = head
#遍历两个链表,然后拼接成新链表
while(l1 or l2):
#如果某一个链表已经遍历完,不再继续遍历
if l1 == None:
currentNode.next = l2
print "l2=",l2.val
break
if l2 == None:
currentNode.next = l1
print "l1=",l1.val
break
#判断大小
if l1.val < l2.val:
#拼接新链表
currentNode.next = l1
currentNode = currentNode.next
print "l1=",l1.val
l1 = l1.next
else:
currentNode.next = l2
currentNode = currentNode.next
print "l2=",l2.val
l2 = l2.next
return head.next
复制代码
谦言忘语
个人目前只懂一丁点python语法,所以不做语法上的优化,而且整体代码风格效果会尽量跟C语言趋于一致。