剑指 Offer 25. 合并两个排序的链表

剑指 Offer 25. 合并两个排序的链表

easy

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例1:

1
2
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

归并排序

本质上也是个双指针

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	fakeHead := &ListNode{} // 伪头节点
	curNode := fakeHead
	for l1 != nil || l2 != nil {
		if l1 == nil {
			curNode.Next = l2
			break
		}
		if l2 == nil {
			curNode.Next = l1
			break
		}

		if l1.Val > l2.Val {
			curNode.Next = l2
			l2 = l2.Next
		} else {
			curNode.Next = l1
			l1 = l1.Next
		}
		curNode = curNode.Next
	}
	return fakeHead.Next
}

伪头节点真的能减少很多边界条件的考虑!

不用伪头节点的情况,很繁琐:

 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
27
28
29
30
31
32
33
34
35
36
37
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	if l1 == nil {
		return l2
	} else if l2 == nil {
		return l1
	}

	var head *ListNode
	if l1.Val > l2.Val {
		head = l2
		l2 = l2.Next
	} else {
		head = l1
		l1 = l1.Next
	}
	curNode := head
	for l1 != nil || l2 != nil {
		if l1 == nil {
			curNode.Next = l2
			break
		}
		if l2 == nil {
			curNode.Next = l1
			break
		}

		if l1.Val > l2.Val {
			curNode.Next = l2
			l2 = l2.Next
		} else {
			curNode.Next = l1
			l1 = l1.Next
		}
		curNode = curNode.Next
	}
	return head
}