Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 限制:
0 <= 链表长度 <= 1000
二、思路分析
- 首先创建一个dummynode头节点,方便操作。
- 首先考虑迭代法,cur表示头节点,如果l1,l2其中一条链表为空则中止循环,如果l1.Val<l2.Val,则将cur.Next指向l1负责指向l2,最后cur向后移动,如果l1,或者l2不为空,则直接添加到后方。
- 面试官问是否有更简洁的做法,即精简代码的做法,当场表示不会,回来之后学习了一下。
- 如果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
}
}
复制代码
四、总结
面试可能会两种做法都问到,写的时候稍微写慢一些,回答问题可以拓展一下,不然面试官一直提出新的问题,总是会回答不到的。