leetcode21-合并两个有序链表
解题思路:
- 构造一个数值(val)为0的节点(ListNode) newhead=pre(pre后面改变了,所以要多一个外部引用newhead)
- 比较输入的两个链表头部l1,l2的数值大小,将pre链接到其中数值小的节点,并且其中数值小的节点更新为其右边(前面)一个节点;
- 将节点pre更新为pre右边一个节点
- 只要l1,l2不为None,循环2,3步骤
- 循环结束后剩下的节点是数值大的节点,将pre链接到该节点
- 最后输出为newhead的右边一个节点,因为结果不包括自己构造的节点ListNode(0)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
pre=newhead=ListNode(0)
while l1 and l2:
if l1.val<l2.val:
pre.next=l1
l1=l1.next
else:
pre.next=l2
l2=l2.next
pre=pre.next
if l1:
pre.next=l1
elif l2:
pre.next=l2
return newhead.next
自己编写测试程序
# 有序链表1
head1 = ListNode(2)
n1 = ListNode(3)
n2 = ListNode(4)
n3 = ListNode(9)
head1.next = n1
n1.next = n2
n2.next = n3
# 有序链表2
head2 = ListNode(3)
m1 = ListNode(5)
m2 = ListNode(7)
m3 = ListNode(8)
head2.next = m1
m1.next = m2
m2.next = m3
s = Solution()
res = s.mergeTwoLists(head1,head2)
while res:
print(res.val)
res = res.next