原文链接:https://mp.weixin.qq.com/s/dVqXEMKZ6_tuB7J-leLmtg

一、解决题目(LeetCode)

21. 合并两个有序链表(简单)

23. 合并K个升序链表(困难)

141. 环形链表(简单)

142. 环形链表 II(中等)

876. 链表的中间结点(简单)

160. 相交链表(简单)

19. 删除链表的倒数第 N 个结点(中等)

二、相关题目

双指针技巧

21.合并两个有序链表

原题链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/submissions/

图片

也使用了常见的「虚拟头节点」技巧,也就是head节点。如果不使用head虚拟节点,代码会复杂很多,而有了head节点这个占位符,可以避免处理空指针的情况,降低代码的复杂性。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
    head := &ListNode{
        Val: 0,
        Next: nil,
    }
    p := head
    p1, p2 := list1, list2 
    for p1 != nil && p2 != nil {
        if p1.Val <= p2.Val {
            p.Next = p1 
            p1 = p1.Next 
        } else {
            p.Next = p2 
            p2 = p2.Next 
        }
        p = p.Next 
    }

    if p1 != nil {
        p.Next = p1 
    }
    if p2 != nil {
        p.Next = p2 
    }

    return head.Next 
    
}

23. 合并 k 个有序链表

原题链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/

图片