Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 均按 非递减顺序 排列
思路分析:
比较两个链表的结点,比如 A 有 3 个结点,B 有 3 个 结点。
A 的第一个结点比 B 的第一结点小,就把 A 的第一个结点加到结果链表中,后面再让 A 的第二个结点和 B 的第一个结点比较,小的再加到结果链表中。
-
定义一个链表节点。
-
对于两个有序链表进行无限循环。
-
两个链表的当前节点都是空,则跳出循环。
-
定义一个链表节点的内部变量。
比较两个链表节点的当前值,小的值的节点保存到内部变量,然后对应链表的当前节点指向下一个节点。
如果其中的一个链表的当前节点没有值,则另一个有值的当前节点保存到内部变量。 -
内部变量中保存的节点添加到 1 中定义的链表节点的下一个节点。
-
1 中定义的链表节点的当前节点指向下一个节点。
-
AC 代码:
golang :
// 21. 合并两个有序链表
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
var list ListNode
tmp := &list
tmp1 := list1
tmp2 := list2
for {
if tmp1 == nil && tmp2 == nil {
break
}
var node *ListNode
if tmp1 != nil && tmp2 != nil {
if tmp1.Val < tmp2.Val {
node = tmp1
// 链表1指向下一个节点
tmp1 = tmp1.Next
} else {
node = tmp2
// 链表2指向下一个节点
tmp2 = tmp2.Next
}
} else if tmp1 != nil {
node = tmp1
// 链表1指向下一个节点
tmp1 = tmp1.Next
} else if tmp2 != nil {
node = tmp2
// 链表2指向下一个节点
tmp2 = tmp2.Next
}
// 保存值较小的节点
tmp.Next = node
// 指向下一个节点
tmp = node
}
return list.Next
}
总结:
毕业之后好像没写过链表,居然有些不会写了。
该问题比较简单,主要是两个链表中的某个元素添加到结果链表中后,对应链表的当前节点要指向下一个节点,结果链表中的当前节点也要指向下一个节点。