21. 合并两个有序链表

21. 合并两个有序链表

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

image-20220320144805235

示例 2:

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

示例 3:

1
2
输入:l1 = [], l2 = [0]
输出:[0]

归并

加个伪头节点更方便

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
	if list1 == nil && list2 == nil {
		return nil
	}
	fakeHead := &ListNode{} // 这玩意儿可以叫哨兵节点...
	p := fakeHead
	for list1 != nil || list2 != nil {
		if list1 == nil {
			p.Next = list2
			list2 = list2.Next
		} else if list2 == nil {
			p.Next = list1
			list1 = list1.Next
		} else {
			if list1.Val > list2.Val {
				p.Next = list2
				list2 = list2.Next
			} else {
				p.Next = list1
				list1 = list1.Next
			}
		}
		p = p.Next
	}
	return fakeHead.Next
}

递归

蛮傻的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
	if list1 == nil && list2 == nil {
		return nil
	}
	if list1 == nil {
		return list2
	}
	if list2 == nil {
		return list1
	}

	if list1.Val > list2.Val {
		list2.Next = mergeTwoLists(list1, list2.Next)
		return list2
	} else {
		list1.Next = mergeTwoLists(list1.Next, list2)
		return list1
	}
}