欢迎光临
我们一直在努力

一天一道算法题(18):合并链表的思路与实现解析

21. 合并两个有序链表

文章目录

    • [21. 合并两个有序链表](https://leetcode.cn/problems/merge-two-sorted-lists/)
    • ==思路==
    • 总结

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

示例 1:

img

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

思路

  • 起一个头节点,然后双指针分别指向list1和list2依次判断这两个节点的val值,把较小的排到头结点后面

  • 时间复杂度为O(n+m),空间复杂度为O(1)

  • /**
    * Definition for singly-linked list.
    * type ListNode struct {
    * Val int
    * Next *ListNode
    * }
    */

    func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
    //定义头节点
    dummy := &ListNode{}
    cur := dummy
    for {
    if list1 == nil || list2 == nil {
    break
    }

    if list1.Val <= list2.Val {
    //如果list1的val值较小,就把该节点排到cur后面
    cur.Next = list1
    list1 = list1.Next
    } else {
    //同理
    cur.Next = list2
    list2 = list2.Next
    }
    //移动cur
    cur = cur.Next
    }
    //把没排完的剩下的节点直接排在cur的后面
    if list1 == nil {
    cur.Next = list2
    } else {
    cur.Next = list1
    }

    return dummy.Next
    }

总结

本文是 《算法题目解析系列》 的第 [18] 篇,本系列将持续更新,每篇都提供清晰的思路与编程语言实现。欢迎关注,第一时间获取更新。如果你有想看的题目,也可以在评论区留言告诉我。

赞(0)
未经允许不得转载:171主机测评 » 一天一道算法题(18):合并链表的思路与实现解析
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址