essay

hot100-合并两个有序链表

#算法

hot100——合并两个有序链表

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

示例 1:

image.png

输入: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 均按 非递减顺序 排列

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
    // 创建一个虚拟头节点(dummy node),仅用于简化链表构建逻辑
    // 它的值不重要,真正的结果从它的下一个节点开始
    dummy := &ListNode{}
    
    // curr 指向当前结果链表的最后一个节点,初始时指向 dummy
    curr := dummy
 
    // 当两个链表都还有剩余节点时,持续比较并合并
    for list1 != nil && list2 != nil {
        if list1.Val <= list2.Val {
            // list1 当前节点值更小,将其接到结果链表末尾
            curr.Next = list1
            // list1 指针向后移动一位,指向下一个待处理节点
            list1 = list1.Next
        } else {
            // list2 当前节点值更小,将其接到结果链表末尾
            curr.Next = list2
            // list2 指针向后移动一位,指向下一个待处理节点
            list2 = list2.Next
        }
        // curr 指针向后移动一位,始终指向结果链表的新尾部
        curr = curr.Next
    }
 
    // 此时至少有一个链表已经遍历完
    // 由于输入链表本身是有序的,可直接将剩余部分拼接到结果末尾
 
    if list1 != nil {
        // list1 还有剩余,全部接上(无需逐个处理)
        curr.Next = list1
    }
    if list2 != nil {
        // list2 还有剩余,全部接上
        curr.Next = list2
    }
 
    // 返回 dummy 的下一个节点,即合并后链表的真实头节点
    // (dummy 本身是辅助节点,不应包含在结果中)
    return dummy.Next
}
comments如果有不同意见或者补充,直接留在这里。
contact

在别处继续找到我

如果你想聊技术、设计,或者只是打个招呼。

暂未配置外部链接