【Golang】LeetCode 21. 合并两个有序链表

21. 合并两个有序链表

题目描述

思路

解决这道题我们使用一个常见的思路,那就是设立一个哑节点dummyNode。在解 LeetCode Hot 100 链表部分的题目时,我们经常需要建立哑节点,并让哑节点的值为空,它的Next指向真正的链表当中的节点。这样,才完成对链表的处理之后,返回dummyNode.Next就是我们想要的最终答案。

建立好哑节点之后,我们建立三个指针p, q, t := list1, list2, dummyNode,然后开始使用p, q对两个链表进行遍历。循环的条件是p != nil && q != nil,如果p.Val < q.Val,就意味着在答案所对应链表当中,当前的p节点应该排在当前的q节点前面。我们使用t来维护答案所在的链表,令t.Next = p,将当前节点插入到t节点之后当中。

反之,如果p.Val >= q.Val,则我们将当前的q插入到t之后。

节点插入之后,我们同时将p / q以及t向后移动一位,继续对两个链表进行遍历和比对。

当循环终止时,链表未必已经完全插入,因为其中某个链表可能很短,而另一个很长。但由于题目中已经显式地告诉了我们,两个链表是有序的,因此当前t节点所在的链表的最后一个节点(最大值)一定不比还没结束的链表当前的头节点的值更大。基于这条性质,我们将当前还没结束的链表的节点所对应的指针插入到t之后即可。

由于t是在对dummyNode进行维护,最终我们返回dummyNode.Next即位答案。

基于以上思路,我们来写代码解决问题。

Golang 代码

go 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
    dummyNode := new(ListNode)
    p, q, t := list1, list2, dummyNode
    for p != nil && q != nil {
        if p.Val < q.Val {
            t.Next = p
            p = p.Next
        } else {
            t.Next = q
            q = q.Next
        }
        t = t.Next
    }

    if p != nil {
        t.Next = p
    }
    if q != nil {
        t.Next = q
    }

    return dummyNode.Next
}
相关推荐
khalil102010 小时前
代码随想录算法训练营Day-41动态规划08 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
数据结构·c++·算法·leetcode·动态规划
Vect__10 小时前
C++无痛转go第一天,从hello world到切片
开发语言·c++·golang
1104.北光c°10 小时前
Leetcode215 三种写法完成数组中的第K个最大元素 【hot100算法个人笔记】【java写法】
java·笔记·程序人生·算法·leetcode·排序算法·快速选择
浅念-11 小时前
LeetCode最短路必看:BFS算法原理+经典题解
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
代码地平线12 小时前
【数据结构】二叉树详解:全代码逐行解析+6道LeetCode高频OJ题图解
数据结构·算法·leetcode
田梓燊12 小时前
翻转二叉树
leetcode
流年如夢13 小时前
顺序表(LeetCode)
c语言·数据结构·leetcode·职场和发展
浅念-1 天前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
研究点啥好呢1 天前
字节跳动Go后端开发工程师面试题精选:10道高频考题+答案解析
面试·golang·php·求职招聘
im_AMBER1 天前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵