首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

35岁+程序员男朋友被裁,该怎么安慰他?

男朋友被裁员了,该怎么安慰他?一位35岁+程序员女朋友在线寻求方法

她表示自己男朋友35+程序员被裁,不知道以后要干嘛,很迷茫….以前只是看裁员的帖子,这一次真的轮到自己,才发现这种感受是形容不来的…..哎,还想着能狗到40岁,没想到这么快…..

其实35被裁已经不是什么新鲜事情了,虽然知道这样不对,但是作为社畜的我们也无力改变。

怎么说呢,就真的挺难的,网友表示35岁了后面也不知道干嘛,考公也考不了, 互联网真的没法养老 不该抱有幻想

还有网友表示,35岁+的女生更难,起码男生还是有机会的,但是女生是几乎没有

为了缓解小姐姐的忧虑,不少网友纷纷起哄,不如直接换个男朋友吧,焦虑秒没

最后还是那句话,继续找工作呗,还能干嘛。工作难找也还是得找啊

下面是今日的大厂算法题

今日算法题,来自LeetCode的第23题:合并 K 个升序链表,下面是我的算法思路及实现,让我们来看看吧。

# 算法题目

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

# 算法思路

1.分治法:

将K个链表分成两部分,先分别处理这两部分,然后将两个部分的结果合并。这一过程递归进行,直到问题规模缩小到可以直接解决。

2.合并两个有序链表:

在分治的过程中,我们需要一个辅助函数来合并两个有序链表。这个函数从两个链表的头节点开始,比较它们的值,选择较小的节点加入到结果链表中,然后移动指针继续比较,直至所有节点都被合并。

3.递归合并:

不断将链表对分成更小的子集,直到每个子集只有一个链表或没有链表。然后开始合并这些链表,最终得到单个排序链表。

# 代码实现

C语言实现

由于C语言代码的实现相对较长,这里提供一个概述思路和关键函数的伪代码:

//定义链表结构体`struct ListNode`struct ListNode { int val; struct ListNode *next;};//实现`mergeTwoLists(struct ListNode* a, struct ListNode* b)`函数合并两个有序链表struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode preHead; struct ListNode *p = &preHead; preHead.next = NULL; while (l1 != NULL && l2 != NULL) { if (l1->val < l2->val) { p->next = l1; l1 = l1->next; } else { p->next = l2; l2 = l2->next; } p = p->next; } if (l1 != NULL) { p->next = l1; } else { p->next = l2; } return preHead.next;}//使用分治法`mergeKLists(struct ListNode** lists, int listsSize)`,递归地将链表数组分成更小的部分,使用`mergeTwoLists`函数合并struct ListNode* merge(struct ListNode** lists, int left, int right) { if (left == right) { return lists[left]; } if (left > right) { return NULL; } int mid = left + (right - left) / 2; struct ListNode* l1 = merge(lists, left, mid); struct ListNode* l2 = merge(lists, mid + 1, right); return mergeTwoLists(l1, l2);}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) { return merge(lists, 0, listsSize - 1);}

Java实现

class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; }}public class Solution { public ListNode mergeKLists(ListNode[] lists) { if (lists.length == 0) return null; return merge(lists, 0, lists.length - 1); } private ListNode merge(ListNode[] lists, int left, int right) { if (left == right) return lists[left]; int mid = left + (right - left) / 2; ListNode l1 = merge(lists, left, mid); ListNode l2 = merge(lists, mid + 1, right); return mergeTwoLists(l1, l2); } private ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; if (l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2); return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } }}

Python实现

class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = nextdef mergeKLists(lists): if not lists or len(lists) == 0: return None def mergeTwoLists(l1, l2): if not l1: return l2 if not l2: return l1 if l1.val < l2.val: l1.next = mergeTwoLists(l1.next, l2) return l1 else: l2.next = mergeTwoLists(l1, l2.next) return l2 def merge(lists, left, right): if left == right: return lists[left] mid = left + (right - left) // 2 l1 = merge(lists, left, mid) l2 = merge(lists, mid + 1, right) return mergeTwoLists(l1, l2) return merge(lists, 0, len(lists) - 1)

# 算法解析

分治法在解决这类问题时极为有效,它通过递归地将问题分解为更小的子问题来降低问题的复杂度,然后再合并结果。

这种方法的时间复杂度为O(N log K),其中N是所有链表中元素的总和,K是链表个数。这是因为每次迭代中元素的比较次数总共为N,而分治的深度为log K。

# 示例和测试

假设我们有K=3个链表[1->4->5, 1->3->4, 2->6],使用上述Python代码进行合并,结果应该是一个新的有序链表1->1->2->3->4->4->5->6。

# 总结

合并K个升序链表是一个典型的分治法应用案例,通过将问题分解为可管理的小部分,再逐步合并结果,我们可以高效地解决这个问题。不同编程语言的实现虽有差异,但算法的核心思想是一致的

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OxN4-evgEkbNUmmosJGWXEZA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券