21.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

 示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
 示例 2:

输入:l1 = [], l2 = []
输出:[]

 示例 3:
 
输入:l1 = [], l2 = [0]
输出:[0]

提示:

两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列

Related Topics 递归 链表 👍 3195 👎 0

解题思路:

  • 如果 l1 或 l2 为空,直接返回另一个非空链表。
  • 比较头节点: 比较 l1 和 l2 的头节点值,将较小值的节点作为新链表的头节点。
  • 递归调用: 将较小值节点的 next 指针指向 l1 和 l2 剩余部分合并后的链表(通过递归调用实现)。
  • 返回新链表的头节点。
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {

 	var dummy = &ListNode{}
 	current := dummy
 	for list1 != nil && list2 != nil {
 		if list1.Val < list2.Val {
 			current.Next = list1
 			// 往后移动list1
 			list1 = list1.Next
 		} else {
 			current.Next = list2
 			// 往后移动list2
 			list2 = list2.Next
 		}
 		current = current.Next
 	}
 
 	// 分别把 list1 / list2 剩余的补到后面
 	if list1 != nil {
 		current.Next = list1
 	}
 	if list2 != nil {
 		current.Next = list2
 	}
 
 	return dummy.Next
}