面试手撕|合并两个有序链表

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例1:

输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 限制:

0 <= 链表长度 <= 1000

二、思路分析

  1. 首先创建一个dummynode头节点,方便操作。
  2. 首先考虑迭代法,cur表示头节点,如果l1,l2其中一条链表为空则中止循环,如果l1.Val<l2.Val,则将cur.Next指向l1负责指向l2,最后cur向后移动,如果l1,或者l2不为空,则直接添加到后方。
  3. 面试官问是否有更简洁的做法,即精简代码的做法,当场表示不会,回来之后学习了一下。
  4. 如果l1为空返回l2,如果l2为空返回l1,如果l1.Val < l2.Val 则调用递归函数,继续比较l1.Next与l2的值。

三、AC 代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
    dummyNode := &ListNode{}
    cur := dummyNode
    for l1 != nil && l2 != nil {
        if l1.Val < l2.Val {
            cur.Next = l1
            l1 = l1.Next
        }else{
            cur.Next = l2
            l2 = l2.Next
        }
        cur = cur.Next
    }
    if l1 != nil {
        cur.Next = l1
    }
    if l2 != nil {
        cur.Next = l2 
    }
    return dummyNode.Next
    
}

递归法,简洁写法
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
    if l1 == nil {
        return l2
    }
    if l2 == nil {
        return l1
    }
    if l1.Val <= l2.Val{
        l1.Next = mergeTwoLists(l1.Next,l2)
        return l1
    }else {
        l2.Next = mergeTwoLists(l1,l2.Next)
        return l2
    }
}
复制代码

四、总结

面试可能会两种做法都问到,写的时候稍微写慢一些,回答问题可以拓展一下,不然面试官一直提出新的问题,总是会回答不到的。

Supongo que te gusta

Origin juejin.im/post/7076346612921925645
Recomendado
Clasificación