LeetCode:21. 合并两个有序链表(python)
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:
- 迭代,遍历两个链表,比较两个节点值,指向较小值节点
- 递归,比较链表,更新较小值链表节点的
next
,递归剩余链表
附代码(Python):
-
迭代
class ListNode: def __init__(self, x): self.val = x self.next = None # 迭代 class Solution: def mergeTwoLists(self, l1, l2): if not l1: return l2 if not l2: return l1 res = cur = ListNode(None) # 创建新链表 while l1 and l2: # 指向较小值节点 if l1.val < l2.val: cur.next = l1 l1 = l1.next else: cur.next = l2 l2 = l2.next cur = cur.next # 指向剩余链表 if l1: cur.next = l1 else: cur.next = l2 return res.next
# 创建链表 def build_link(nums): li = cur = ListNode(None) for i in nums: cur.next = ListNode(i) cur = cur.next return li.next nums1 = [1, 2, 4] nums2 = [1, 3, 4] l1 = build_link(nums1) l2 = build_link(nums2) # 合并两个有序链表 test = Solution() res = test.mergeTwoLists(l1, l2) # 打印 while res: print(res.val, end=' ') res = res.next print()
1 1 2 3 4 4
-
递归
class ListNode: def __init__(self, x): self.val = x self.next = None # 递归 class Solution: def mergeTwoLists(self, l1, l2): if not l1: return l2 # 递归截止 elif not l2: return l1 # 递归截止 elif l1.val < l2.val: # l1.val 较小时,指向 l1(返回 l1),并往下递归 l1.next l1.next = self.mergeTwoLists(l1.next, l2) return l1 else: # l2.val 较小时,指向 l2(返回 l2),并往下递归 l2.next l2.next = self.mergeTwoLists(l1, l2.next) return l2
# 创建链表 def build_link(nums): li = cur = ListNode(None) for i in nums: cur.next = ListNode(i) cur = cur.next return li.next nums1 = [1, 2, 4] nums2 = [1, 3, 4] l1 = build_link(nums1) l2 = build_link(nums2) # 合并两个有序链表 test = Solution() res = test.mergeTwoLists(l1, l2) # 打印 while res: print(res.val, end=' ') res = res.next print()
1 1 2 3 4 4