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 均按 非递减顺序 排列
通过次数867,716提交次数1,301,052
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
和并归排序的思路差不多,不过需要注意的是在移动指针的时候不要丢失指针位置,一个是头指针的记录,另一个就是节点的当前位置,再一个就是两个链表可能出现不等长的情况,这时候要在程序结束时将未遍历完的指针链接到拼接后的链表末尾。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
if list1 == nil{
return list2
}
if list2 == nil{
return list1
}
var head, pointer *ListNode
if list1.Val > list2.Val{
head = list2
list2 = list2.Next
}else{
head = list1
list1 = list1.Next
}
pointer = head
for list1 != nil && list2 != nil{
if list1.Val > list2.Val{
pointer.Next = list2
list2 = list2.Next
}else{
pointer.Next = list1
list1 = list1.Next
}
pointer = pointer.Next
}
if list1 != nil {
pointer.Next = list1
}else{
pointer.Next = list2
}
return head
}